javascript 中 caller 与 callee 的作用以及用法

这两个关键字在平时编码中几乎难以用到,但它们既然存在于javascript语言体系中,那么还是有必要了解下。

callerjavascript 函数类型的一个属性,它引用调用当前函数的函数

		function func() {
		    alert(func.caller);
		}
		
		function func1() {
		    func();
		}
		
		func1();

比如上面的代码, 因为 func 函数是被 func1 函数调用的, 所以 func 函数中对 caller 的引用就是 func1 函数。如果 func 函数直接在顶层的 javascript 环境中被调用,那么 caller 将返回 null

我们可以利用 caller 的特性跟踪函数的调用链:

		function func() {
		    let caller = func.caller;
		    while(caller != null) {
		        console.log(caller.name);
		        caller = caller.caller;
		    }
		}
		
		function func1() {
		    func();
		}
		
		function func2() {
		    func1();
		}
		
		function func3() {
		    func2();
		}
		
		func3();

以上代码将 func3func 的函数调用链打印出来。

callee 则不是函数对象的属性,它是函数上下文中 arguments 对象的属性:

		function func() {
		    alert(arguments.callee);
		}

它引用的是函数自身,在上面的代码中,arguments.callee 引用的就是 func 函数本身。既然他引用的是函数本身,那么似乎显得有点多余,当我们需要在函数体内使用函数本身时,直接通过函数名调用就可以了,干嘛还要多此一举的通过 arguments.callee 这样去调用。然而我觉得 callee 存在的意义可能是想解耦函数本身对函数名称的依赖吧, 比如说在递归的环境下,函数内部通常还要调用函数本身, 而调用函数本身就免不了硬编码函数名称, 如果函数名称有变化, 那么函数中的代码也需要修改,使用 callee 就可以避免此类情况。

		function factorial( num ) {
		    if( num == 1 ) {
		        return 1;
		    }
		    let result = num * factorial(num - 1);
		    return result;
		}
		
		alert(factorial(100));

上面的阶乘函数通过callee可以改造成:

		function factorial( num ) {
		    if( num == 1 ) {
		        return 1;
		    }
		    let result = num * arguments.callee(num - 1);
		    return result;
		}
		
		alert(factorial(100));

如此同样实现递归, 但是可以做到函数体不依赖函数名称。


转载自 简书 大侠陈 的文章 javascript中caller与callee的作用以及用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值