arguments

2019-04-05  本文已影响0人  Luigi_Lin

所有非箭头函数都有arguments这个局部变量。arguments有长度、索引元素,但没有其他Aarray有的属性,是类数组对象。
arguments拥有属性callee,callee为arguments所在的函数。

转换为数组

将arguments转换成数组是常见的操作。

  1. Array.prototype.slice.call(arguments) / [].slice.call(arguments)
    ps. slice会阻止某些js引擎优化(详情见mdn

  2. Array.from(arguments) ES2015新增方法

  3. [...arguments] ES2015新增展开操作符

  4. 遍历arguments创建新数组

  5. Array.apply(null, arguments) 利用Array构造函数

实参与arguments

在非严格模式下,有传入的实参与arguments绑定,例如:

test(1);

function test(x, y){
    x = 2;
    console.log(x, arguments[0]); //2 , 2

    y = 3;
    console.log(y, arguments[1]); //3 , undefined
}

而严格模式下,实参与arguments则没有这样的表现。
所以在非严格模式下,arguments与对应的实参应该是共享内存地址的。

leaking arguments

arguments不应该传递到函数外,泄漏可能会影响js引擎的优化。例如:

function leak1(){
  return arguments;
}

function leak2(){
  var args = [].slice.call(arguments);
}

function leak3(){
  var a = arguments;
  return function(){
    return a;
  }
}
上一篇下一篇

猜你喜欢

热点阅读