本文介绍了JavaScript中arguments.callee属性的功能和替换方案,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
arguments.callee的作用
在函数内部,有两个特殊的对象:arguments和this。其中arguments的主要用途是保存函数参数,但是这个对象也有一个名为callee的属性,这个属性是指向拥有这个arguments对象的函数的指针。请看下面这个非常经典的阶乘函数。
函数阶乘(数字){
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的替换方案
论据;被调用方()现在已被弃用;
原因:访问参数是一项开销很大的操作,因为它是一个非常大的对象,每次递归调用时都需要重新创建。它影响了现代浏览器的性能,也影响了闭包。
不能用怎么办?
就像第三段中的例子一样,重写factorial()方法会导致trueFactorial()的意外结果。这是用来演示的。平时要避免写代码。
在递归中使用arguments.callee()很常见,例如
一个面试问题。接受参数n=5,输出不带for循环的数组[1,2,3,4,5]。
这种带有arguments.callee的递归思想如下
功能显示(n) {
var arr=[];
return (function () {
arr . un shift(n);
n-;
如果(n!=0) {
arguments . callee();
}
返回arr
})()
}
show(5)//[1,2,3,4,5]
现在arguments.callee已被弃用。怎么办?其实很简单。给内部函数起个名字就行了。
功能显示(n) {
var arr=[];
return(函数fn() {
arr . un shift(n);
n-;
如果(n!=0) {
fn();
}
返回arr
})()
}
show(5)//[1,2,3,4,5]
斐波那契递归算法替换
函数阶乘(数字){
if (num=1) {
返回1
}
var fac=1
return(函数fn() {
fac *=数字
数量-
如果(num!=0) {
fn()
}
返回因素
})()
}
阶乘(5) //120
这就是本文关于JavaScript中arguments.callee属性的功能和替代方法。希望对大家的学习有帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。