,,JavaScript中arguments.callee属性的作用与替换方案

,,JavaScript中arguments.callee属性的作用与替换方案

本文介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: