JavaScript 中 caller,callee,call,apply 这几个涉及到函数调用的概念,这里总结一下。
callee 是函数的 arguments 对象的一个属性,指代当前这个函数。利用 arguments.callee,我们可以让函数递归的调用自己,而不用总是写出这个函数的名字。例如:
function factorial (n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n; }
caller 是 Function 对象的一个属性,指代调用当前函数的函数;如果当前函数在顶层,caller 就是 null。例如
function main() { hello(); } function hello() { alert("caller is " + hello.caller.name); // caller is main } main();
为了方便使用,我们通常用 arguments.callee.caller 来代替 funcname.caller。即上面的例子也可以改为
function main() { hello(); } function hello() { alert("caller is " + arguments.callee.caller.name); // caller is main } main();
call 和 apply 可以将一个函数绑定为另一个对象的方法来执行,即使得在该函数内部 this 指向该对象。这两者的区别只在于参数的形式不同:
func.call(thisArg[, arg1[, arg2[, ...]]]) func.apply(thisArg[, argsArray])
两者的第一个参数都为 this 所指向的对象。但是使用 call 时,该函数的参数在后面直接列出;而使用 apply 时,该函数的参数作为一个 array 给出。
参考资料:
[1] arguments.callee - MDN
[2] caller - MDN
[3] Function.prototype.call - MDN
[4] Function.prototype.apply - MDN
[5] 全面理解javascript的caller,callee,call,apply概念(修改版)
[6] Why was the arguments.callee.caller property deprecated in JavaScript?
[7] Using recursion combinators in JavaScript