javascript - “leaking arguments”是谎言吗?

标签 javascript ecmascript-6 arguments

在 JavaScript 中,there is a point “参数泄漏”会影响优化。例如:

function leakingArguments() {
    var a = arguments;
    return function() {
        return a;
    };
}

参数泄漏 这是在该函数外部使用的函数参数。在这种情况下,编译器可能不会优化该代码。

所以我建立了一个jsperf ,他们的表现是平等的。看来将参数传递出函数不会影响结果执行时间。

let MAX_LENGTH = 1000

let arr = Array.from({length: MAX_LENGTH}, (v, i) => i)

let withoutArguments = function() {
  let cloneArgs = Array.apply(null, arguments)

  return function() {
    cloneArgs[0] = 1
    return
  }
}

let argumentsFn = function() {
  let args = arguments
  let cloneArgs = Array.apply(null, arguments)

  return function() {
    args[0] = 1
    return
  }
}

withoutArguments(...arr)
argumentsFn(...arr)

真的存在“参数泄露”吗?

最佳答案

我想质疑您的性能测试用例,因为:

(1) 您只调用这些函数一次,引擎 JIT 不太可能编译它们,而这正是优化真正重要的地方。

(2) 您从未调用返回的函数,因此您从未真正修改参数

(3) arguments 的主要问题是值必须实时反射(reflect)到闭包变量中,因此这个测试用例会更好:

function urgh(a) {
 const leak = arguments;
 return function() {
   leak.a = 1;
   console.log(a);
 };
}

关于javascript - “leaking arguments”是谎言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504744/

相关文章:

javascript - 使用数组元素填充提示并为它们编号

javascript - jQuery 在 innerHTML 声明之前设置闪烁文本

javascript - React 默认调用不带括号的函数 useState

javascript - 将对象值从一个对象映射到另一个对象

python - 为什么我的 Frame 子类在 init 中抛出错误?

javascript - 从 HTML 传递 JS 参数

javascript - 仅针对选定的数据属性?

javascript - 对于循环调用 HTTPS 地理编码 api 并将结果输入坐标到 SQL 数据库,如何让 Node 的 HTTPS 模块工作?

javascript - 如何编辑我的代码而不出现 setState() 问题?

c# - 需要参数命名以防止外观相同的参数列表出现歧义