2016-05-25 3 views
9

Я взглянул на AngularJS 2 и Typcript, и я решил сделать что-то с этим, чтобы изучить основы TypScript. Со многими исследованиями я нашел хорошие темы о модулях, Typcript, и один из них говорил о команде «let» и «var» для объявления переменных; в соответствии с this вопрос, код Машинопись ниже должен показывать только один предупреждение и выдаст сообщение об ошибке в консоли:'let и' var 'одинаковы в машинописном тексте?

test.ts:

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

Составитель test.js:

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

Но это не так. Компилятор «игнорирует» команду «let» и превращает ее в команду «var». Почему это происходит? Работает ли TypScript только с классами?

Я использую конфигурацию AngularJS для «запуска НОГО», поэтому он автоматически компилирует мой файл «test.ts»:

"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

Подробнее о 'let' в машинописном: https: // basarat .gitbooks.io/typescript/content/docs/let.html – basarat

ответ

11

Но это не так. Компилятор «игнорирует» команду «let» и превращает ее в команду «var». Почему это происходит? Работает ли TypScript только с классами?

Компилятор по умолчанию переводит на ES3. Ключевое слово let не существует в ES3, поэтому эмиттер должен испускать код с использованием синтаксиса, доступного в ES3 ... в этом случае лучшей заменой ключевого слова let является ключевое слово var.

Если вы хотите, чтобы испустить с let ключевого слова, то вы должны быть направлены ES6- "target": "es6" в tsconfig.json или параметр командной строки --target es6. Выполнение этого будет выводиться с тем же кодом, который вы ввели.

Обратите внимание, что даже если ваш код работает во время выполнения, он выдает сообщение об ошибке, чтобы вы знаете, что вы допустили ошибку во время компиляции:

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

В этом примере var и let имеет тот же эффект, с var существами немного быстрее на большинстве JS-движков, поэтому TypeScript делает некоторые оптимизации производительности для вас, изменяя это на var.

Теперь, если вы попробуйте другой пример, вы увидите, что let не просто превращается в var, но больше магии происходит:

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

Действительно, в этом примере let и var не будет то же самое эффект. let будет отображать 1 2 3 при использовании var мы посмотрели 3 3 3. Если вы хотите узнать больше о let ключевом слове, введенном ES6 вы можете проверить это:

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

+0

'i <1' So zero (0)? * Up * это для 'i <5', поэтому люди могут действительно увидеть магию. Может быть, предложить тот же цикл, используя 'var', чтобы сравнить различия. Просто предложение. – Marcus

+0

Я думаю, что это не то же самое. Если я запускаю свой пример в чистом JS, консоль дает мне ошибку и отображается только одно предупреждение, как я ожидал. Если я поместил его в TS и скомпилировал, он отобразит оба предупреждения, потому что он превращает «let» в «var». Поэтому я не получаю одинаковых результатов с одними и теми же кодами только потому, что TS не принимает слово «let». –

+0

@Marcus здесь количество итераций не меняет точку: транспиляция совершенно другая, когда мы покидаем стек с помощью setTimeout, даже если это только один раз. Вы можете видеть, что с помощью https://www.typescriptlang.org/play/ – floribon

0

Они идентичной но есть разница, когда они используются внутри функция.

LET

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

// emre is NOT visible here. 
} 

ВАР

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

// emre is visible here too. 
} 
+0

Это не очень хороший пример. Компилятор TypScript будет жаловаться, но 'emre' на самом деле все еще отображается за пределами' for' в примере 'let'. – JohnnyHK

 Смежные вопросы

  • Нет связанных вопросов^_^