2016-04-25 7 views
3

warum var Deklaration schnell als sie

'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();

den Code oben in Chrom ausgeführt, warum test1 schnell als Test. Ist das Schuld oder meine Schuld?

50000000 
test: 1146 

50000000 
test1 : 148 
+0

In Firefox sehe ich dieses Verhalten nicht. Ich bekomme für beide Funktionen rund 100 Millisekunden. – Pointy

+2

Ich bezweifle, dass irgendjemand, aber ein Chrome-Entwickler, diese Frage beantworten könnte, und ich bezweifle, wie nützlich es ist, diese spezielle Eigenart der Implementierung von Scoping-Einbauten zu verstehen (aber ich gebe zu, dass ich falsch liege). – apsillers

+1

'Let' zwingt die Erstellung eines zusätzlichen Bereichs. Es wird wahrscheinlich einige Zeit verloren sein, dies zu schaffen. –

Antwort

3

Es könnte sein, erwähnenswert, dass in es6 das let Schlüsselwort in einer for-Schleife wurde entwickelt, das berüchtigte closure in a loop Problem in JavaScript zu lösen:

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>

Als @ Loganfsmyth erwähnt in Kommentaren, indem es effektiv eine neue Schließung für jede Iteration der Schleife erstellt.

Dies und die Tatsache, dass die Funktion neu ist, könnte einen Teil des Leistungsunterschieds in Chrome ausmachen. Allerdings scheint es für Firefox in Ihrem Beispiel keinen Unterschied zu geben, daher scheint es für den Browser möglich zu sein, dies zu optimieren.

Verwandte Themen