为什么在for循环之后比for循环之前慢得多?

在node.js v6.0.0

function testlet() { let a = 0; for (var i = 0; i < 100000000; i++) {} } function testlet2() { for (var i = 0; i < 100000000; i++) {} let a = 0; } console.time('let'); testlet(); console.timeEnd('let'); console.time('let2'); testlet2(); console.timeEnd('let2'); 

let代码中的位置如何导致如此大的性能差异?

我会采取一个有教养的猜测,并说时间的死亡地带是罪魁祸首。

这个循环,似乎是你的微基准,是由优化器吃早餐,因为维亚切斯拉夫·叶戈罗夫喜欢把它放在他的谈话。 即使不是这样,引擎会增加一百万次variables,这两个函数都会花费相同的时间。

什么是不同的是当variablesa创build。 在你的第一个片段中,它在函数的开头,没有任何东西。 没有时间死区,它本质上是一个函数范围variables; 改变它为一个var不会有所作为(尝试它)。 所以当函数被调用时,带有variables的作用域被创build,并且初始化值为0 ,然后一些代码运行(或者不运行)。
相反,在第二个片段中有一个暂时的死亡区。 在let声明之前的代码中,访问a必须抛出一个exception。 所以当这个函数被调用的时候,这个作用域就被创build了,并且a被保留的槽被保留,但是没有被初始化。 在这种状态下,代码运行(或不运行),只有在该variables将被初始化并赋值为0

因此,如果let处于代码之中(或之后),范围更加复杂。 这可能会导致优化器以不同的方式对待它,甚至可能影响同一范围内的variablesi ,或者可能根本无法进行某些优化。