Развлечение с подъемом

В сегодняшней серии 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. Они связаны между собой, и, как вы могли уже заметить, неправильное понимание подъема и области действия может привести к очень неприятным ошибкам. Но это разговор на другой день!

Я люблю слышать любые отзывы или если было что-то, что я пропустил. Оставьте комментарий ниже!