js arguments.callee和caller用法

本文详细解析了JavaScript中arguments对象的功能与使用方法,包括其属性如callee、length及properties-indexes,通过实例展示了如何利用arguments.callee实现递归调用,并对比了caller属性的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值