函数的arguments
什么是arguments
arguments的实质就是一个类数组对象,没有数组上的方法,是函数的一个内置对象,它包含了调用函数时传入的所有参数。
并且这个对象只有以function关键字定义的函数时才会有,箭头函数语法创建的函数是无法使用的。
当我们不确定有多少个参数的时候,可以用argument来获取
arguments上的属性
- 具有数组的length属性
function fn() {
//输出的是传递参数的个数
console.log(arguments.length); // 3
}
fn(543,645,657);
- 按照索引的方法进行存储,并且可以通过索引方式修改参数
function fn() {
console.log(arguments[1]); // 645
// 按照数组的方法对arguments进行遍历
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
// 543,
// 645
// 657
}
arguments[0] = 666
arguments[1] = 777
arguments[2] = 888
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
// 666
// 777
// 888
}
}
fn(543,645,657);
arguments中的callee属性
callee属性是一个指向arguments对象所在函数的指针。
用经典的阶乘函数来举例
//常规写法
function factorial(num) {
if (num <= 1) {
return 1
} else {
return num * factorial(num - 1)
}
}
===============================================
//使用argument.callee
function factorial(num) {
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
}
在上述代码中arguments.callee代替了factorial函数,这样做的好处是让函数逻辑与函数名解耦.这也就意味着,无论函数叫什么名字,都可以正确引用函数
function factorial(num) {
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
}
let tempFactorial = factorial
factorial = function () {
return 0
}
console.log(tempFactorial(5)); //120
console.log(factorial(5)); // 0
这里,tempFactorial变量被赋值为 factorial,实际上把同一个函数的指针又保存到了另一个位置。然后,factorial 函数又被重写为一个返回 0的函数。如果像 factorial()最初的版本那样不使用arguments.callee,那么像上面这样调用 trueFactorial()就会返回0。不过,通过将函数与名称解耦,trueFactorial()就可以正确计算阶乘,而 factorial()则只能返回0。