2017-01-09 3 views
3

Не уверен, что это было отвечено в другом месте. Я прошел через this ответ«let» vs «var» внутри «блока»

Это мой код:

var fruit = "apple"; 
 
if (true) { 
 
    console.log(fruit); // expected "apple" 
 
    let fruit = "orange"; // since this is not hoisted to the top 
 
    console.log(fruit); // "orange" as expected 
 
}

Почему мы не можем получить доступ к внешней переменной fruit внутри if блока. Я понимаю, что переменные, объявленные с let, не поднимаются в пределах области блока/функции.

Я получаю Uncaught ReferenceError: fruit is not defined Ошибка. Почему так?

Хотя, если я изменю имя переменной внутри блока if на что-то еще, тогда он работает так, как ожидалось. Итак, почему этот конфликт с тем же именем, главным образом, когда let fruit = "orange" не поднят на вершину.

+4

«В ECMAScript 2015, пусть поднимут переменный в верхней части блока. Однако, ссылаясь на переменную в блоке до объявления переменной, вы получаете ссылку ReferenceError. " - [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let) – Gerrit0

+1

Не знаком с 'ES', но почему бы вам просто не попробовать 'fruit = 'orange'' вместо префикса 'let' –

+0

См. переписанный код по адресу http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-0%2Cstage-1% 2Cstage-2% 2Cstage-3 & код = переменная% 20fruit% 20% 3D% 20% 22apple% 22% 3B% 0Aif% 20 (истинно)% 20% 7B% 0A% 20% 20console.log (фрукты)% 3B% 20% 2F% 2F% 20expected% 20% 22apple% 22% 20% 0A% 20% 20let% 20fruit% 20% 3D% 20% 22orange% 22% 3B% 20% 2F% 2F% 20since% 20this% 20is% 20not% 20hoisted% 20to% 20the% 20top% 0A% 20% 20console.log (фрукты)% 3B% 20% 2F% 2F% 20% 22orange% 22% 20as% 20expected% 0A% 7D и экспериментальная = истина & площадка = ложь и свободные = ложь и спецификации = ложь. Это должно дать вам некоторую перспективу –

ответ