,,JavaScript arguments.callee作用及替换方案详解

,,JavaScript arguments.callee作用及替换方案详解

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

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