这里只介绍关于
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的问题,但为了避免遗忘还是选择贴上代码.