【问题标题】:why var declaration fast than let为什么 var 声明比 let 快
【发布时间】:2016-08-19 05:55:17
【问题描述】:

'use strict'

function test() {
  let t = Date.now();
  let p = 0;
  for (let i = 0; i < 100000000; i++) {
    p += i % 2;
  }
  console.log(p)
  console.log('test: ', Date.now() - t);
}

function test1() {
  var t = Date.now();
  var p = 0;
  for (var i = 0; i < 100000000; i++) {
    p += i % 2;
  }
  console.log(p)
  console.log('test1 : ', Date.now() - t);
}

test();
test1();

在 chrome 中运行上面的代码,为什么 test1 比 test 快。是我们的错还是我的错?

50000000
test:  1146

50000000
test1 :  148 

【问题讨论】:

  • 在 Firefox 中,我看不到这种行为。这两个函数我得到了大约 100 毫秒。
  • 我怀疑除了 Chrome 开发人员之外的任何人都可以回答这个问题,并且我怀疑理解 Chrome 实现范围界定内部的这个特殊怪癖是否有用(但我承认我可能错了)。
  • let 强制创建额外的范围。创建它可能会浪费一些时间。
  • 您期望什么? varlet 在这里做两件不同的事情,let 涉及更多的资源分配。此外,let 可能还没有优化,因为它相对较新。
  • @Xufox 在一般情况下,每次使用let 循环通过let 都会创建一个新的执行环境。在您的具体示例中,可能并非如此,但let 是一个全新的功能,即使可以进行优化,也可能尚未完成。

标签: javascript ecmascript-6


【解决方案1】:

值得一提的是,在 es6 中,for 循环中的 let 关键字旨在解决 JavaScript 中臭名昭著的 closure in a loop 问题:

var log = msg => div.innerHTML += msg + "<br>";

for (var i=0; i < 3; i++) {
  Promise.resolve().then(() => log(i)); // 3, 3, 3
}
for (let i=0; i < 3; i++) {
  Promise.resolve().then(() => log(i)); // 0, 1, 2
}
&lt;div id="div"&gt;&lt;/div&gt;

正如@loganfsmyth 在 cmets 中提到的,它通过为循环的每次迭代有效地创建一个新的闭包来实现这一点。

这一点以及该功能是新功能这一事实可能会导致 Chrome 中出现一些性能差异。也就是说,对于您的特定示例,Firefox 似乎没有区别,因此浏览器似乎可以对此进行优化。

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多