本文主要介绍JavaScript arguments.callee的功能及其替换方案的详细说明。通过示例代码详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友可以参考一下。
一、arguments.callee的作用:返回正被执行的 Function 对象
arguments的主要用途是保存函数参数,但是这个对象还有一个属性叫做callee,返回正在执行的函数对象,也就是指定函数对象的文本,有利于匿名函数的递归或者保证函数的封装。
请看下面这个非常经典的阶乘函数。
函数阶乘(数字){
if (num=1) {
返回1;
}否则{
返回数字*阶乘(数字-1)
}
}
一般用递归算法来定义阶乘函数。如上面的代码所示,当函数有了名字,名字以后不会变的时候,这个定义就没有问题了。
但问题是这个函数的执行与函数名factorial紧密耦合。为了消除这种紧耦合现象,可以如下使用。
arguments.callee
函数阶乘(数字){
if (num=1) {
返回1;
}否则{
返回num * arguments . callee(num-1);
}
}
在这个重写的factorial()函数体中,没有对函数名factorial的引用。这样,无论引用函数时使用什么名字,都可以保证递归调用正常完成。例如
函数阶乘(数字){
if(num=1){
返回1;
}否则{
返回num * arguments . callee(num-1);
}
}
var trueFactorial=factorial
alert(true factorial(5));//120
阶乘=function() {
返回0;
}
alert(true factorial(5));//120如果不使用arguments.callee,它将返回0
这里,变量truefactorial获取factorial的值,这实际上保存了一个指向另一个位置的函数的指针。然后,我们给阶乘变量分配一个返回0的函数。如果arguments.callee没有像原始factorial()那样使用,调用trueFactorial()将返回0。但将函数体中的代码与函数名解耦后,trueFactorial()仍然可以正常计算阶乘;至于factorial(),现在只是一个返回0的函数。
二、arguments.callee的替换方案
论据;被调用方()现在已被弃用;
原因:访问参数是一个开销很大的操作,因为它是一个很大的对象,每次递归调用时都需要重新创建。它影响了现代浏览器的性能,也影响了闭包。
不能用怎么办?
在递归中使用arguments.callee()是很常见的,比如面试问题。接受参数n=5,输出不带for循环的数组[1,2,3,4,5]。这是一个递归思想,带有参数。被调用方代码如下:
功能显示(n) {
var arr=[];
return (function () {
arr . un shift(n);
n-;
如果(n!=0) {
arguments . callee();
}
返回arr
})()
}
show(5)//[1,2,3,4,5]
现在arguments.callee已被弃用。怎么办?其实很简单。给内部函数取个名字就行了(调用函数时,它的arguments.callee对象会指向自身,也就是对自身的引用。)
功能显示(n) {
var arr=[];
return(函数fn() {
arr . un shift(n);
n-;
如果(n!=0) {
fn();
}
返回arr
})()
}
show(5)//[1,2,3,4,5]
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。