arguments

这里只介绍关于

  arguments.callee.caller这个属性。

  为了直接了解这个属性的特性,码来!

 1         function getOneNumber(fun1,fun2){
 2            whatNum("1",fun1,fun2);
 3         }
 4 
 5         function getTwoNumber(fun1,fun2){
 6            whatNum("2",fun1,fun2);
 7         }
 8 
 9         function getThreeNumber(fun1,fun2){
10            whatNum("3",fun1,fun2);
11         }
12         
13         function whatNum(num,fun1,fun2){
14             var ids = setTimeout(function(){
15                 console.log(num);
16                 fun1(fun2,arguments.callee.caller);
17                 clearTimeout(ids);
18             },1000);
19         }        
20       
21          function getNumber(fun1,fun2,fun3){
22             fun1(fun2,fun3);
23         }
24 
25         getNumber(getOneNumber,getTwoNumber,getThreeNumber); 
26 
27 
28         // 让 getOneNumber调用  getTwoNumber;
29         // 让  getTwoNumber调用  getThreeNumber;
30         // 让   getThreeNumber 再去调用 getOneNumber;
31   

  这里不要去考虑死循环和堆栈溢出的问题.

 执行结果报出fun1 is not funciton.

 原因是 arguments.callee.caller 为空,稍微调整下代码.bug解除.

 

        function getOneNumber(fun1,fun2){
           whatNum("1",fun1,fun2);
        }

        function getTwoNumber(fun1,fun2){
           whatNum("2",fun1,fun2);
        }

        function getThreeNumber(fun1,fun2){
           whatNum("3",fun1,fun2);
        }
        
        function whatNum(num,fun1,fun2){
            var f = arguments.callee.caller;
            var ids = setTimeout(function(){
                console.log(num);
                fun1(fun2,f);
                clearTimeout(ids);
            },1000);
        }
        

        function getNumber(fun1,fun2,fun3){
            fun1(fun2,fun3);
        }

        getNumber(getOneNumber,getTwoNumber,getThreeNumber);        

 将 arguments.callee.caller放在外面就可以了,setTimeout也是个函数,放在里面就找不到调用者函数了.

所以在使用arguments.callee.caller要看清它所在的环境它的调用函数.

 

  这只是一个很low的问题,但为了避免遗忘还是选择贴上代码.

上一篇:函数


下一篇:javascript中的匿名函数