zoukankan      html  css  js  c++  java
  • 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的问题,但为了避免遗忘还是选择贴上代码.

  • 相关阅读:
    洛谷—— P1196 银河英雄传说
    MySQL练习题参考答案
    January 16 2017 Week 3 Monday
    January 15 2017 Week 3 Sunday
    January 14 2017 Week 2nd Saturday
    January 13 2017 Week 2 Friday
    January 12 2017 Week 2 Thursday
    January 11 2017 Week 2nd Wednesday
    January 10 2017 Week 2nd Tuesday
    January 09 2017 Week 2nd Monday
  • 原文地址:https://www.cnblogs.com/wangjingzhi/p/12114852.html
Copyright © 2011-2022 走看看