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

  • 相关阅读:
    Java内置包装类
    for循环思路题
    常用函数
    函数
    冒泡排序
    数组的运用
    for循环中有意思的练习题。
    for循环
    运算中容易出现的错误
    分支的运用
  • 原文地址:https://www.cnblogs.com/wangjingzhi/p/12114852.html
Copyright © 2011-2022 走看看