前言
javascript 中的 caller 和 callee 一眼望过感觉是一样的,然而一个字母的区别在应用中却天差地别。字面意思 caller 直接翻译为调用者,callee 翻译为被召者。那么这两个到底是什么?怎么用?是我们本文的重点。
arguments
一个对应于传递给函数的参数的类数组对象
在了解 callee 之前我们先了解函数内部 arguments 这个特殊的属性。
为什么说 arguments 是类数组的对象
因为他具有数组一样的访问性质及方式, 可以通过 arguments[n] 来访问对应的单个参数的值, 并拥有数组长度属性 length.并且 arguments 对象存储的是实际传给函数的参数,不局限于函数声明时所定义的形参.不能显式创建 arguments 对象,arguments 对象只有函数中才能用.
callee
arguments 它包含着所有传入函数中的参数。这也让我们明白了 arguments 的主要用途就是保存函数参数。这个对象有一个名叫做 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
function testArguments(num, type) {
console.log(arguments);
console.log(arguments[0], arguments[1]);
}
testArguments(10, "前端callee");
从打印结果我们可以看出 arguments 中保存我们调用函数传入的形参,arguments 中也有一个 callee 的属性。
call 特点
- callee 是 arguments 对象的属性
- arguments.callee 指向参数所属的当前执行的函数. 就是说 callee 返回正在被执行的 function 对象, 也就是所指定的 function 对象的正文.
- callee 属性的初始值就是正被执行的 Function 对象.
- callee 表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性
- callee 拥有 length 属性,这个属性可用于验证。arguments.length 是实参长度,arguments.callee.length 是形参长度,可以判断调用时形参长度是否和实参长度一致。
caller
非标准: 该特性是非标准的,请尽量不要在生产环境中使用它!
返回调用指定函数的函数。caller 是 function 的属性。该属性不是 ECMA-262 第 3 版标准的一部分.不过, SpiderMonkey (Mozilla 的 JavaScript 引擎) (查看 bug 65683), V8 (Chrome 的 JavaScript 引擎) 和 JScript(IE 的 ECMAScript 实现)都已经支持了它.
caller 指向调用当前函数的函数。
ECMAScript 5 也规范化了另一个函数对象的属性 caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为 null。
function myq() {
if (myq.caller === null) {
console.log("该函数在全局作用域内被调用!");
} else console.log("调用我的是函数是" + myq.caller);
}
myq();
//该函数在全局作用域内被调用!
function myq() {
if (myq.caller == null) {
console.log("该函数在全局作用域内被调用!");
} else console.log("调用我的是函数是" + myq.caller);
}
function callQ() {
myq();
}
callQ();
/*
调用我的是函数是function callQ() {
myq()
}
*/