2016-04-25 91 views
3

爲什麼VAR聲明快不是讓

'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運行上面的代碼,爲什麼測試1比試驗快。是我們的錯還是我的錯?

50000000 
test: 1146 

50000000 
test1 : 148 
+0

在Firefox中,我沒有看到這種行爲。這兩種功能都可以使用大約100毫秒。 – Pointy

+2

我懷疑任何人,但Chrome開發人員可以回答這個問題,並且我懷疑理解Chrome實現範圍內部的這種特殊怪癖的用處(但我承認我可能是錯的)。 – apsillers

+1

'let'強制創建附加範圍。創造這個可能會浪費一些時間。 –

回答

3

的設計是爲了解決在JavaScript中臭名昭著closure in a loop問題,這可能是值得一提的是,在一個for循環ES6的let關鍵字:

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 
 
}
<div id="div"></div>

正如@ loganfsmyth在註釋中提到,它通過爲循環的每次迭代有效地創建一個新的閉包來實現這一點。

這一點以及該功能是新功能的事實可能會解釋Chrome中出現的一些性能差異。也就是說,對於您的特定示例,Firefox似乎沒有區別,所以瀏覽器似乎可以優化這一點。