arguments
arguments.callee (当前函数)
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解除.
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 f = arguments.callee.caller;
15 var ids = setTimeout(function(){
16 console.log(num);
17 fun1(fun2,f);
18 clearTimeout(ids);
19 },1000);
20 }
21
22
23 function getNumber(fun1,fun2,fun3){
24 fun1(fun2,fun3);
25 }
26
27 getNumber(getOneNumber,getTwoNumber,getThreeNumber);
将 arguments.callee.caller放在外面就可以了,setTimeout也是个函数,放在里面就找不到调用者函数了.
所以在使用arguments.callee.caller要看清它所在的环境它的调用函数.
这只是一个很low的问题,但为了避免遗忘还是选择贴上代码.