js arguments.callee和caller用法

 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是返回本身自己的函数

猜你喜欢

转载自blog.csdn.net/dwb123456123456/article/details/85044718