美文网首页
Javascript 中的arguments

Javascript 中的arguments

作者: wuf_io | 来源:发表于2018-05-16 17:48 被阅读0次

    在函数内部,有两个特殊的对象,arguments和this ,本篇文章 主要介绍arguments.

    arguments它是一个类数组对象,包含着传入函数中的所有参数,主要作用是保存了函数当前调用的参数。

    使用方法 arguments[i]。例子如下

    function sayHello(){
      console.log("hello"+ arguments[0]+ arguments[1]);
    }
    
    sayHello(2,3)
    
    // hello23
    

    另外通过arguments.length 属性可以获知有多少参数传给函数

    function sayHello(){
      console.log(arguments.length)
    }
    
    sayHello('string',1,56)
    
    // 3
    

    arguments 类型为类数组对象

    (function(){
      return  typeof arguments
    })()
    
    // object
    

    arguments还有一个callee的方法,该属性是一个指针,指向拥有这个 arguments 对象的函数,因此可以用来实现对函数的递归的调用,例如

    function factorial(num){
      if (num<=1) {
        return 1
      } else {
        return num*factorial(num-1)
      }
    }
    

    上面是一个简单的递归算法,如上面代码所示,在函数有名字,且这个名字以后都不会改变,那么这样定义没有问题,但这个函数的执行与函数名factorial仅仅耦合在一起了,处产生改函数赋值给其他变量,在执行的过程中,得到的结果是不一样的,为消除这种耦合性,可以向下面这样使用arguments.callee.

    function factorial(num){
      if (num) {
        return 1 
      }else {
        return num*arguments.callee(num-1)
      }
    }
    

    这样在函数内部,没有在引用factorial,无论引用函数时使用什么明细,都可以保证完成递归调用。例如:

    var trueFactorial = factorial;
    console.log(trueFactorial (5));  //120
    
    factorial = function(){
      return 0
    }
    console.log(trueFactorial (5));  //120  如果没有使用arguments.callee,将返回0
    

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

    注意:1.arguments 不能够创建,是函数自身的参数
    2.类似数组,但不是数组
    3.arguments 是个对象

    由于arguments .callee 是个很大的对象,每次 递归时都需要重新创建,影响浏览器性能,也影响闭包,所以不推荐使用

    相关文章

      网友评论

          本文标题:Javascript 中的arguments

          本文链接:https://www.haomeiwen.com/subject/vykmdftx.html