arguments

作者: Luigi_Lin | 来源:发表于2019-04-05 20:10 被阅读0次

    所有非箭头函数都有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;
      }
    }
    

    相关文章

      网友评论

          本文标题:arguments

          本文链接:https://www.haomeiwen.com/subject/hzukiqtx.html