gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章JavaScript arguments.callee作用及替换方案详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、arguments.callee的作用:返回正被执行的 Function 对象 。

   arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文,这有利于匿名函数的递归或者保证函数的封装性.

   请看下面这个非常经典的阶乘函数 。

?
1
2
3
4
5
6
7
function factorial(num){ 
   if (num <=1) {    
    return 1;  
   } else {    
   return num * factorial(num-1)  
   }
}

定义阶乘函数一般都要用到递归算法;如上面的代码所示,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。 但问题是这个函数的执行与函数名 factorial 紧紧耦合在了一起。为了消除这种紧密耦合的现象,可以像下面这样使用 。

arguments.callee 。

?
1
2
3
4
5
6
7
function factorial(num){ 
   if (num <=1) {    
    return 1;  
   } else {    
   return num * arguments.callee(num-1);
   }
}

在这个重写后的 factorial()函数的函数体内,没有再引用函数名 factorial。这样,无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。例如 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function factorial(num){
       if (num <= 1){
         return 1;
       } else {
         return num * arguments.callee(num-1);
       }
     }
     var trueFactorial = factorial;
     alert(trueFactorial(5));  //120 
 
 
     factorial = function () {
       return 0;
     }       
     alert(trueFactorial(5)); // 120 如果没有使用arguments.callee,将返回0

在此,变量 trueFactorial 获得了 factorial 的值,实际上是在另一个位置上保存了一个函数的指针。然后,我们又将一个简单地返回 0的函数赋值给 factorial 变量。如果像原来的 factorial() 那样不使用 arguments.callee,调用 trueFactorial()就会返回 0。可是,在解除了函数体内的代码与函数名的耦合状态之后,trueFactorial()仍然能够正常地计算阶乘;至于factorial(),它现在只是一个返回 0的函数.

2、arguments.callee的替换方案 。

现在已经不推荐使用arguments.callee(); 。

原因:访问 arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包.

不能用怎么办?

递归时用到arguments.callee()是常见的事情,比如一道面试题。接受参数n=5,不用for循环输出数组【1,2,3,4,5】,这是用递归的思路,配合arguments.callee,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
function show(n) {
   var arr = [];
   return ( function () {
     arr.unshift(n);
     n--;
     if (n != 0) {
       arguments.callee();
     }
     return arr;
   })()
}
show(5) //[1,2,3,4,5]

现在arguments.callee 被弃用了。怎么办,其实很简单,给内部函数一个名字即可(当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
function show(n) {
   var arr = [];
   return ( function fn() {
     arr.unshift(n);
     n--;
     if (n != 0) {
       fn();
     }
     return arr;
 
   })()
}
show(5) //[1,2,3,4,5]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://www.cnblogs.com/vickylinj/p/13526157.html 。

最后此篇关于JavaScript arguments.callee作用及替换方案详解的文章就讲到这里了,如果你想了解更多关于JavaScript arguments.callee作用及替换方案详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com