Развлечение с подъемом
В сегодняшней серии TL;DR мы поговорим о подъеме. Нажмите здесь, чтобы узнать больше о серии TL;DR.
В JavaScript все объявления переменных с использованием var поднимаются в верхнюю часть области видимости функции или глобальной области видимости. Вот ключевые правила:
- Объявления функций поднимаются над объявлениями переменных.
- Функциональные выражения не поднимаются.
- Присвоения переменных не поднимаются.
- Переменные, которым присваивается значение перед объявлением, автоматически становятся частью глобальной области видимости.
- Объявления размещаются в верхней части функциональных блоков, а не блоков кода.
Объявления функций поднимаются над объявлениями переменных.
После подъема это выглядит следующим образом:
function foo(){}; var foo; console.log(typeof foo)
Поднятие перемещает объявления в начало блоков кода
Результат не определен! Это потому, что var x; внутри блока if поднимается наверх функции. Присвоение x=1 сохраняется в блоке if, поэтому x никогда не присваивается значение. После подъема код выглядит следующим образом:
function foo(){ var x; if (false){ x = 1; } console.log(x);
Помните, присваивание переменной не поднимается
После подъема код интерпретируется так:
var foo; function foo(){}; foo = "abc";
Присвоения переменных НЕ поднимаются
После подъема код интерпретируется так:
var bar; console.log(bar); bar = "abc"; console.log(bar);
Функциональные выражения НЕ поднимаются
Остерегайтесь глобального охвата
Почему «защита»? Давайте сначала посмотрим, что происходит. Объявление функции bar поднимается в начало файла, за которым следует var foo. Значение foo присваивается «def», но при вызове bar() значение foo присваивается «def». Поскольку foo не объявлен локально внутри функции bar(), переменная foo здесь — это та же самая переменная foo в глобальной области видимости. Вот почему в консоли выводится «def».
"строгое использование"
Объявление "use strict"; в начале скрипта запрещает присваивание переменных до объявленного начала. Используя его, многих из этих проблем с подъемом можно избежать.
С подъемом связано понятие области действия переменных JavaScript. Они связаны между собой, и, как вы могли уже заметить, неправильное понимание подъема и области действия может привести к очень неприятным ошибкам. Но это разговор на другой день!
Я люблю слышать любые отзывы или если было что-то, что я пропустил. Оставьте комментарий ниже!