arguments:
含义:该对象代表正在执行的函数和调用它的函数的参数。
语法:
[function.]arguments[n]
参数:function :当前正在执行的 Function 对象的名字。
n :要传递给 Function 对象的从0开始的参数值索引。
说明:在前面执行上下文的学习过程中,知道生成执行上下文需要两个阶段,分别是进入执行上下文和执行阶段。在其中的进入执行上下文阶段中,需要做三个工作,其中一个工作是创建幷初始化AO,即arguments对象。
Arguments Objects 是函数上下文里的激活对象AO中的内部对象,它包括下列属性:
callee:指向当前函数的引用
length: 真正传递的参数的个数
properties - indexes:就是函数的参数值(按参数列表从左到右排列)
{
function add(a, b) {
console.log(arguments.callee);
return a + b;
}
add(3, 4);
}
从结果可以看到,callee是一个指针,指向拥有这个arguments对象的函数。
有一个例子阶乘
{
function fac(num) {
if (num <= 1) { //0的阶乘也是1
return 1;
}
else {
return num * fac(num - 1);
}
}
// 当出现这种情况时,
var trueFac = fac;
fac = function (num) {
return 0;
};
console.log(trueFac(10));
}
上面的案例有一个问题,结果为0
所以
{
function fac(num) {
if (num <= 1) { //0的阶乘也是1
return 1;
}
else {
return num * arguments.callee(num - 1);
}
}
var trueFac = fac;
fac = function (num) {
return 0;
};
console.log(trueFac(10));
}
arguments.callee指向arguments对象的拥有函数引用,当把fac的函数引用赋给trueFac后,arguments对象的拥有函数变成了trueFac,所以结果是正确的。
2. caller
caller与callee不同,caller属性并不属于arguments对象,它是函数对象的属性,Opera的早期版本不支持,这个属性保存着调用当前函数的函数的引用。
{
var a = function () {
console.log(a.caller);
}
var b = function () {
a();
}
b();
}
{
function outer() {
inner();
}
function inner() {
console.log(inner.caller);
}
outer();
}
从结果可知,因为outer()调用了inner() ,所以inner.caller就指向outer()
总结:caller是返回调用该函数的引用
callee是返回本身自己的函数