Следующий код генерирует ReferenceError 'a не определен'.Определенная переменная в внешней области не определена во внутренней области
{
let a = 'a1';
{
console.log(a);
let a = 'a2';
}
}
Как и следующий.
{
const a = 'a1';
{
console.log(a);
const a = 'a2';
}
}
Если вы используете объявления var, это работает так, как я ожидаю. (Ошибка при ошибке и «a1» зарегистрированы.)
Мне становится еще труднее понять, когда я пытаюсь проанализировать следующий код.
{
let a = 'a1';
{
console.log(a);
var a = 'a2';
}
}
Он выбрасывает синтаксический обрыв, «Идентификатор« a »уже объявлен».
Naïvely Я ожидал, что идентификатор будет затенен только после Объявление let или const, как и поведение let в Clojure или let * в Racket. Как described clearly on MDN, это не так, как это работает.
Но Почему работает ли это так? Почему у Racket есть как let, так и let * form?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let – Teemu
Спасибо за ссылку, но она не отвечает на мой вопрос. Я понимаю, что это работает, но не _why_ эта модель выбрана. Это из-за проблем с производительностью? –
SO - это не место, где можно задать _why_ язык имеет определенную функцию или поведение. Спросите [TC-39] (https: // www.ecma-international.org/memento/TC39-RF-TG.htm), они знают без спекуляций. Я мог бы немного догадаться. Может быть, механизм подъема был настолько важен, что он предпочтительнее внешних переменных? – Teemu