在函数内部,有两个特殊的对象,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 是个很大的对象,每次 递归时都需要重新创建,影响浏览器性能,也影响闭包,所以不推荐使用
网友评论