Проверить, что typeOf undefined не работает?

Может кто-нибудь объяснить, почему это не работает?

setOrientation: function() {
    if (typeof oldOrientation !== 'undefined') console.log(oldOrientation);
    let oldOrientation = orientation;
    //other code
}

Это кидает oldOrientation is undefined, Я в конце концов просто удалил let и это начало работать, но мне трудно понять, почему. Я полагаю, это как-то связано со сферой?

Я исправил проблему, объявив oldOrientation глобально, я просто хочу понять, почему сравнение для typeof не работает так, как было.

2 ответа

Решение

От MDN let :

В ECMAScript 2015 привязки let не подлежат перемещению переменных, что означает, что объявления let не перемещаются в начало текущего контекста выполнения. Ссылка на переменную в блоке перед инициализацией приводит к ReferenceError (в отличие от переменной, объявленной с помощью var, которая будет иметь неопределенное значение). Переменная находится во "временной мертвой зоне" от начала блока до обработки инициализации.

Означает, что вы использовали переменную до ее определения.


Если вы привыкли использовать var что происходит var объявления перемещаются в верхнюю часть области блока из-за подъема. Итак, следующая функция

function foo() {
  console.log(typeof bar)
  var bar = "123";
}

рассматривается как

function foo() {
  var bar;
  console.log(typeof bar)
  bar = "123";
}

Но когда вы используете let, их нет, поэтому объявление не перемещается в верхнюю часть блока.

Представьте себе этот упрощенный случай:

let a = 1;

{
 alert(a);
 let a = 2;
}

Тогда alert (a) выполнит поиск переменной. Это начинается с текущей области видимости (блока), которая имеет свою собственную объявленную переменную (пусть a), но еще не установленную (a = 2), поэтому она еще не определена. Верхний равен:

let a = 1;

{
 let a /* = undefined */;
 alert(a);
 a = 2;
}

(То, что переменные объявляются перед выполнением кода, называется подъемом...)

Другие вопросы по тегам