2016-05-25 9 views
9

Ich warf einen Blick auf AngularJS 2 und Typoskript und ich beschloss, etwas damit zu machen, nur um die Grundlagen von Typescript zu lernen. Bei vielen Nachforschungen fand ich gute Themen über Module, Typescript, und einer von ihnen sprach über den Befehl 'let' und 'var', um Variablen zu deklarieren;'let und' var 'sind in Typoskript identisch?

test.ts:

for(let i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); 

Zusammengestellt test.js: das Typoskript Code unten sollte nur eine Warnung und wirft einen Fehler in der Konsole nach this Frage, angezeigt werden

for(var i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); 
//# sourceMappingURL=test.js.map 

Aber es ist nicht. Der Compiler ignoriert den Befehl "let" und wandelt ihn in den Befehl "var" um. Warum passiert das? Funktioniert Typescript nur ordnungsgemäß mit Klassen?

Ich verwende AngularJS Konfiguration für 'npm start', so ist es kompiliert meine 'test.ts' Datei automatisch:

"scripts": { 
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ", 
    "lite": "lite-server", 
    "postinstall": "typings install", 
    "tsc": "tsc", 
    "tsc:w": "tsc -w", 
    "typings": "typings" 
    }, 
+0

Mehr auf 'let' in Typoskript: https: // basarat .gitbooks.io/typescript/content/docs/let.html – basarat

Antwort

11

Aber es ist nicht. Der Compiler ignoriert den Befehl "let" und wandelt ihn in den Befehl "var" um. Warum passiert das? Funktioniert Typescript nur ordnungsgemäß mit Klassen?

Der Compiler standardmäßig auf ES3 transpiliert. Das Schlüsselwort let existiert nicht in ES3 und daher muss der Sender Code unter Verwendung der in ES3 verfügbaren Syntax ausgeben ... In diesem Fall ist der beste Ersatz für das Schlüsselwort let das Schlüsselwort var.

Wenn Sie es mit dem let Schlüsselwort emittieren wollen, dann müssen Sie ES6- "target": "es6" in tsconfig.json oder die Befehlszeilenoption --target es6 Ziel. Dies wird mit dem von Ihnen eingegebenen Code ausgegeben.

Beachten Sie, dass, obwohl der Code zur Laufzeit arbeitet, wirft es einen Fehler, den Sie zu wissen, dass Sie einen Fehler bei der Kompilierung gemacht haben:

for(let i = 0; i < 1; i++) { 
    alert(i); 
} 
alert(i); // compile error: cannot find name 'i' 
2

In diesem Beispiel var und let haben die gleiche Wirkung, mit var Wesen ein wenig schneller bei den meisten JS-Engines, so dass TypeScript einige Leistungsoptimierungen für Sie durchführt, indem Sie dies in eine var ändern.

Nun, wenn Sie ein anderes Beispiel versuchen, werden Sie sehen, dass let nicht nur in var geändert wird, aber mehr Magie passiert:

for (let i = 0; i < 3; i++) { 
    setTimeout(function() { alert(i); }); 
} 

der Tat in diesem Beispiel let und var würde nicht die gleiche bewirken. let würde 1 2 3 angezeigt, während var wir 3 3 3 verwenden würden. Wenn Sie mehr über die let Stichwort ES6 eingeführt lernen möchten, können Sie dies überprüfen:

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Instructions/let

+0

'i <1' Also null (0)? * Up * das zu "i <5", damit die Leute wirklich die Magie sehen können. Vielleicht bieten Sie die gleiche Schleife mit 'var' an, um die Unterschiede zu vergleichen. Nur ein Vorschlag. – Marcus

+0

Ich denke, es ist nicht dasselbe. Wenn ich mein Beispiel in reinem JS ausführe, gibt mir die Konsole einen Fehler und nur eine Warnung wird wie erwartet angezeigt. Wenn ich es auf TS setze und kompiliere, werden beide Warnungen angezeigt, weil es das "let" in "var" verwandelt. Ich habe also nicht die gleichen Ergebnisse mit den gleichen Codes, nur weil TS das Wort "Let" nicht akzeptiert. –

+0

@Marcus Hier ändert die Anzahl der Iterationen den Punkt nicht: Die Transpilation ist völlig anders, wenn wir den Stack mit setTimeout verlassen, auch wenn es nur einmal ist. Sie können sehen, dass mit https://www.typescriptlang.org/play/ – floribon

0

Sie sind identisch aber es gibt einen Unterschied , wenn sie innerhalb einer Funktion verwendet.

LET

function theDifference(){ 
    for(let emre = 0; emre < 10; emre++){ 
    // emre is only visible inside of this for() 
    } 

// emre is NOT visible here. 
} 

VAR

function theDifference(){ 
    for(var emre = 0; emre < 10; emre++){ 
    // emre is visible inside of this for() 
    } 

// emre is visible here too. 
} 
+0

Dies ist kein gutes Beispiel. Der Typescript-Compiler wird sich beschweren, aber "emre" ist tatsächlich noch außerhalb des "for" im "let" -Beispiel sichtbar. – JohnnyHK

Verwandte Themen