callee,caller,call,apply

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

原文地址:https://www.cnblogs.com/zoho/p/2870500.html