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

pin*_*fei 6 javascript let node.js

在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'); 
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 7

我会采取有根据的猜测,并说时间死区是罪魁祸首.

这个循环,这似乎是你的微基准是什么,是由优化的早餐吃的维亚切斯拉夫·叶戈罗夫喜欢把它在他的会谈.即使它不是,并且引擎将增加变量一百万次,在两个函数中将花费相同的时间.

不同的a是创建变量的时候.在你的第一个片段中,它位于函数的开头,之前没有任何内容.没有临时死区,它本质上是一个函数范围变量; 将它改为a var不会有所作为(尝试一下).因此,当调用函数时,创建带有变量的范围并将值初始化为0,然后运行(或不运行)某些代码.
相反,在第二个片段中存在时间死区.在let声明之前的代码中,访问a必须抛出异常.因此,当调用该函数时,将创建范围并a保留一个插槽,但保留未初始化.在这种状态下,代码运行(或不运行),只有在此之后变量才会被初始化并赋值0.

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