function中的callee和caller

在函数内部,arguments是一个类数组对象,用于保存函数参数。

这次主要简述一下arguments内部存在的2个属性:calleecaller

callee:

callee:是一个指针,指向拥有这个arguments对象的函数,

例子:

function cool(){console.log(arguments.callee);
}cool();//结果打印出来(chrome下):
ƒ cool(){console.log(arguments.callee);
}

利用callee指针的特性,我们可以用来做阶乘之类的逻辑处理:

下面是最基本常见的阶乘,

function add(num){if(num<=1){return 1;}else{return num * add(num-1);}
}add(10);    //3628800

上面的阶乘有个最大的问题就是,函数内部的执行与函数名add耦合在一起,可以用arguments.callee来消除这种耦合:

function add(num) {if(num <= 1){return 1;}else{return num * arguments.callee(num-1);}
}
add(10);    //3628800

caller:

caller保留着调用当前函数函数的引用。

function add() {addChild();
}function addChild() {console.log(addChild.caller);
}add();//在chrome下打印结果:
ƒ add() {addChild();
}

为了实现低耦合,可以用arguments.callee来实现:

function add() {addChild();
}function addChild(argument) {console.log(arguments.callee.caller);
}add();//在chrome下打印结果:
ƒ add() {addChild();
}

*如果是在全局作用域下调用该函数,callernull

function add() {console.log(arguments.callee.caller);
}add();      //null

注意:

  1. arguments.callee在严格模式下会导致错误;
  2. 不能为caller赋值,否则报错;
  3. ECMAScript5还定义了arguments.caller ,严格模式下会导致错误,非严格模式下是undefined
  4. 定义arguments.callee是为了区分arguments.caller和函数的caller属性。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部