美文网首页
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