переменная const не поднята для немедленно вызываемой функции


Я играл вокруг нового ECMASCRIPT-6 const ключевое слово. Я не понял одного конкретного поведения ключевого слова.

Допустим, у меня есть две функции

Первый случай

(function(){
  console.log(_t); 
  const _t=10;
})();

И второй случай

function t(){
  console.log(_y); 
  const _y=11;
}
t();

Для первого случая выход (не понял почему)

ReferenceError: не удается получить доступ к лексическому объявлению ' _t ' перед инициализацией

Для второго случая выход равен (прекрасно)

Неопределенный

Результат второго случая соответствует ожидаемому, но я не понимаю, почему результат первого случая выдает ошибку. Из ошибки можно сделать вывод, что переменная не поднята. Но почему? Я нашел здесь , что const использует область блока. Имеет ли это какое-то отношение к этому исследованию?

Я использую консоль разработчика Firefox для запуска тестов.

2 10

2 ответа:

Это проблема, связанная с Firefox, как указано в здесь

Специфичные для Firefox заметки

Объявление const было реализовано в Firefox задолго до появления const в спецификации ECMAScript 6. Для соответствия требованиям const ES6 см. ошибки 950547 и 611388.

Начиная с Gecko 36 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33):

{const a=1}; a теперь выдает ReferenceError и больше не возвращает 1 из-за блок-масштабирование. const a; теперь выбрасывает синтаксическую ошибку ("отсутствует = в объявлении const"): требуется инициализатор. const a = 1; a = 2; теперь также бросает синтаксическую ошибку ("недопустимое присвоение const a").

Также я нашел кое-что здесь, а также

Я думаю, что движок Firefox очень строг на подъеме const.

Я думаю, что это имеет смысл.

Когда я пробую его в Firefox (38.0.1), я получаю одно и то же сообщение об ошибке для обоих; что он не может получить доступ к нему до инициализации. Это имеет смысл, поскольку единственная разница заключается в том, что есть выражение функции и объявление функции.

Постоянные идентификаторы на самом деле подняты, поэтому вы получаете ошибку, что он не может быть доступен до его инициализации.

В этом случае область действия блока и область действия функции совпадают, так как блоки кода функции являются единственными блоками, которые вы иметь.

Если вы добавляете блок кода таким образом, что константа находится вне области действия при ее использовании, вы получите сообщение об ошибке "ReferenceError: _y не определен" вместо этого:

function t(){
  {
    const _y = 11;
  }
  console.log(_y); // _y is out of scope
}
t();