<script>function r(x){
   return x;
}
function f(x){
 x[0]=x[0]+">";
 return x;
}
function o(){
   var temp=r;
 r=function(){
   return temp.apply(this,f(arguments));
 }
}
function a(){
 o();
 alert(r("="));}
for(var i=0;i<10;i++){
  a();
  
}</script>
疑点:为什么for循环第n次循环,f()函数就被调用了n次?

解决方案 »

  1.   

    你一句一句的看嘛 for循环里面调用a()函数(for(var i=0;i<10;i++){
      a();),a()函数调用o()函数(function a(){
     o();
     alert(r("="));}),o()函数调用f(arguments)函数啊(return temp.apply(this,f(arguments)))
      

  2.   

    a中o()执行过后
    temp被指向了function(x){
      return x;
    }r被指向了function(){
      return temp.apply(this,f(arguments));
     }
    然后alert了r("=")的返回值 r中又调用了f
    然后 你懂得
      

  3.   

     你说这些我知道,我不明白的地方是:
    for循环第一次时,f()函数就执行1次
    for循环第二次时,f()函数就执行2次
    for循环第三次时,f()函数就执行3次
    for循环第四次时,f()函数就执行4次
    for循环第五次时,f()函数就执行5次
    for循环第六次时,f()函数就执行6次
       ......
    for循环第十次时,f()函数就执行10次这段代码运行完,f()函数总过执行了1+2+3+4+5+6+7+8+9+10=55次
      

  4.   


    temp = r  //循环一次
    temp = function(){return temp.apply(this,arguments)} //循环二次temp的递归调用
      

  5.   


    function r(x){
      return x;                
    }function f(x){          
     x[0]=x[0]+">";            
     return x[0];
    }function o(){
      var temp=r;              
      r =function(){
         /*返回temp函数的执行结果,比如第一次返回的结果就是f(arguments),第二次的时候是将f(arguments)作为参数传入temp(f(arguments)),此时arguments == f(arguments),这样就执行了2次f,一次类推*/
         return temp(f(arguments));     
      }
    }
    function a(){
      o();
      alert(r("="));
    }
    for(var i=0;i<10;i++){
      a();  
    }那这样写能看明白不?
      

  6.   

    下面代码运行一下,也许你就明白了。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>test</title>
    </head>
    <body>
    <script>
    function r(x){
    return x;
    }
    function f(x){
    x[0]=x[0]+">";
    return x;
    }
    function o(){
    var temp=r;
    r=function(){
    var args = f(arguments);
    document.write("&nbsp&nbsptemp: "+temp+"<br/>");
    return temp.apply(this,args);
    }
    }
    function a(){
    o();
    r("=");
    //alert(r("="));
    }
    for(var i=0;i<10;i++){
    document.write("循环第"+(i+1)+"次:<br/>");
    a();
    }</script>
    </body>
    </html>
      

  7.   

    LZ提供的这段代码没错误的,只是这段代码代码风格差,而且作者的意图隐藏得很深,不易理解。
    其实说白了这段代码用到的是一个闭包问题,重写扣的函数r中的temp,每次调用都是不一样的值。
      

  8.   

    他这短代码没错,我这几天看了ECMA262标准中介绍闭包,和作用域,作用域链,明白是怎么一回事了。不过这段代码设计的很巧妙。所以以后大家,直接去官方看英文说明,什么都明白了,真后悔在学校英语没写好。结贴了,感谢大家的帮忙,30分 分别给了 帮我注释代码的2位