重新认识 arguments 对象

128 阅读1分钟
2020_06_17_1KCqBm

函数中的arguments 对象

js函数中具有类似数组一样的对象,这些对象称为 arguments对象,和传递给函数的参数相对应。

传递给js函数的所有参数都可以使用arguments对象来引用。

arguments对象是可用于函数的局部变量。

function f (){
  return arguments;
}
f(1,2,3) // [1,2,3]

2020_06_17_v30ojd

arguments对象和数组相似是因为它也包含索引元素和length属性。

arguments对象 值得关注的属性 【callee】属性。该属性引用的是当前被调用的函数对象,也就是说,如果我们所建函数的返回值是 arguments.callee,那么该函数在被调用时就会返回自身的引用。

2020_06_17_ZQpLu0

function f(){
  return arguments.callee;
}
f() // f()


// 实际案例:通过arguments.callee属性来实现匿名函数的递归调用
(
	function(count){
    if(count < 5) {
      console.log(count); // 会依次打印1,2,3,4
      arguments.callee(++count);
    }
  }
)(1)

// 可以设置arguments对象
function add(num1, num2) {
    arguments[0] = 15;
    var res = num1 + num2;
    return res;
}
var r = add(7, 8);
console.log(r); // 23 在add函数中,num1和arguments[0]引用相同的值。所以,当你更新arguments[0]时,num1的值也会被更新

// 将arguments对象转换为数组 
function add(num1, num2) {
    var arg = Array.prototype.slice.call(arguments);
   	var arg = Array.from(arguments); // ES6 方法
    console.log(arg);
}

总结

  • arguments对象的长度等于传递给函数的参数的数量
  • arguments对象是类似数组的对象,但不是js数组。
  • JavaScript arguments对象索引从零开始。所以第一个参数将被arguments[0]引用,第二个参数将被arguments[1]引用,等等。
  • 通过arguments.callee属性来实现匿名函数的递归调用