Что значит сказать, что объявления подняты, но не инициализированы? - PullRequest
1 голос
/ 10 ноября 2019

Я знаю, что приведенный ниже фрагмент кода приводит к ReferenceError:

console.log(b);
let b = 3;

И я читал, что не получится, если мы будем использовать var вместо let.
Документация MDN утверждает, что декларации let тоже подняты, но они не инициализированы
Что меня смущает, так это инициализация, как это может иметь значение, когда мы говорим о ReferenceError.

В приведенном ниже коде инициализация

let b;
console.log(b);
b = 3;

записывается после console.log(b), но это не делает ReferenceError, поэтому не имеет смысла говорить, что в первомисключение фрагмента выдается, потому что переменная не инициализирована.

Может ли кто-нибудь прояснить эти вещи, пожалуйста?

1 Ответ

1 голос
/ 10 ноября 2019

Объявление letconst) выдаст ошибку, если доступ до инициализирован .

Что это значит?

Вы получите ошибку, если попытаетесь получить доступ к переменной до того, как программа достигнет строки с объявлением:

try{
  console.log(b)
}catch(e){
  console.error(e) //ReferenceError
}

let b //b initalized here (b===undefined)

console.log(b) //undefined
b=3   //Reassign b with 3
console.log(b) //3

Инициализация происходитдаже если в let отсутствует часть =value, в данном случае со значением undefined, поэтому она больше не выдаст ошибку.

Поэтому часть =value нельзя пропуститьиз объявления const: оно будет инициализировано с помощью undefined и не может быть переназначено позже.

Также обратите внимание, что этот тип ошибки отличается от ошибки при попыткеполучить доступ к переменной undefined : первая генерируется, даже если переменная определена (в другой области видимости):

let b=1
console.log(b) //1
{
  //Different scope
  try{
    console.log(b)
  }catch(e){
    console.error(e) //ReferenceError: the inner b shadows the outer, but not yet initialized
  }
  let b=2
  console.log(b) //2
}
...