zoukankan      html  css  js  c++  java
  • arguments.callee Function.callee arguments.caller总结

    arguments.callee

    arguments主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个argumens对象的函数。

    arguments.callee在解决递归的函数名问题时,有很大的作用。

    下面是一个很经典的递归阶乘函数

    function factorial(num) {
      if (num<=1) {
        return 1;
      }else {
        return num*factorial(num-1);
      }
    }

    但是下面的代码会让它出错:

    var anotherFactorial = factorial;
    factorial = null;
    alert(anotherFactorial(4));//报错

    因为调用anotherFactorial的时候,内部需要再次调用factorial,然而factorial已被置于null。

    那么,我们使用arguments.callee指向factorial函数本身,消除这种紧密的耦合,则可以实现了。并且这个方法在需要改动函数名的时候,还可以减少代码的修改量。

    function factorial(num) {
      if (num<=1) {
        return 1;
      }else {
        return num*arguments.callee(num-1);
      }
    }

    但是在严格模式下,不能通过脚本访问arguments.callee,还可以使用命名函数表达式达成上述相同的效果:

    var factorial = (function f(num) {
      if (num<=1) {
        return 1;
      }else {
        return num*f(num-1);
      }
    });

    Function.caller

    这个属性保存着调用当前函数的函数的引用 ,如果是在全局作用域中调用当前函数,它的值为null。

    function inner() {
       console.log(inner.caller); //打印出outer函数
    }
    function outer() {
      inner();
    }
    outer();
    function inner() {
       console.log(arguments.callee.caller); //同样打印出outer函数
    }
    function outer() {
      inner();
    }
    outer();

    arguments.caller

    已过时,严格模式下访问它会导致错误,非严格模式下这个属性始终是undefined。它用来表示调用当前正在执行的函数的函数。MDN上显示此属性已被删除,不再有效。

    end

  • 相关阅读:
    烤盐屋——Beta冲刺日志(2/7)
    团队作业第六次--Beta阶段随笔集合
    OneDay!——冲刺日志集合
    Beta冲刺答辩
    OneDay!——随机组队“吐槽”
    OneDay!——Beta冲刺总结
    用户使用调查报告
    Beta冲刺日志--Day 7
    Beta冲刺日志--Day 6
    Beta冲刺日志--Day 5
  • 原文地址:https://www.cnblogs.com/xiaokeai0110/p/9696402.html
Copyright © 2011-2022 走看看