JavaScript виконання коду JavaScript підключення зовнішнього файлу JavaScript console.log JavaScript змінні і константи JavaScript типи даних JavaScript операції зі змінними JavaScript перетворення даних JavaScript масиви JavaScript умовні конструкції JavaScript цикли JavaScript функції JavaScript область видимості змінних JavaScript замикання і функції IIFE JavaScript Паттерн Модуль JavaScript рекурсивні функції JavaScript перевизначення функцій JavaScript hoisting JavaScript передача параметрів за значенням і за посиланням JavaScript стрілочні функції JavaScript ООП Object JavaScript ООП вкладені об'єкти і масиви в об'єктах JavaScript ООП перевірка наявності і перебір методів і властивостей JavaScript ООП об'єкти у функціях JavaScript ООП конструктори об'єктів JavaScript ООП розширення об'єктів. prototype JavaScript ООП інкапсуляція JavaScript ООП Функція як об'єкт. Методи call і apply JavaScript ООП спадкування JavaScript ООП Ключове слово this JavaScript ООП Object destructuring JavaScript ООП класи JavaScript ООП Date. Робота з датами JavaScript Об'єкт Math. математичні операції JavaScript Об'єкт Array. Робота з масивами JavaScript ООП об'єкт Number JavaScript String JavaScript String Об'єкт RegExp. Регулярні вирази JavaScript String Регулярні вирази в методах String JavaScript String Синтаксис регулярних виразів JavaScript Робота з браузером і BOM JavaScript діалогові вікна JavaScript Історія браузера. об'єкт history JavaScript об'єкт location JavaScript об'єкт navigator JavaScript таймери JavaScript DOM Введення JavaScript DOM Об'єкт document. Пошук елементів JavaScript DOM Властивості об'єкта document JavaScript DOM Об'єкт Node. Навігація по DOM JavaScript DOM Створення, додавання і видалення елементів веб-сторінки JavaScript DOM Об'єкт Element. управління елементами JavaScript DOM Зміна стилю елементів JavaScript події. Введення в обробку подій. JavaScript події обробники JavaScript події. об'єкт Event JavaScript події. поширення подій JavaScript події миші JavaScript події клавіатури JavaScript FORMS. Форми і їх елементи JavaScript FORMS. Кнопки JavaScript FORMS. текстові поля JavaScript FORMS. Прапорці та перемикачі JavaScript FORMS. Список select JavaScript JSON JavaScript зберігання даних. cookie JavaScript зберігання даних. Web Storage JavaScript Collection. Ітератори JavaScript Collection. Генератори JavaScript Collection. Множина Set JavaScript Collection. Map JavaScript Collection. WeakSet і WeakMap JavaScript AJAX. XMLHttpRequest JavaScript AJAX. Відправка даних JavaScript AJAX. Promise в Ajax-запитах

JavaScript hoisting


Hoisting представляє процес доступу до змінних до їх визначення. Можливо, дана концепція виглядає трохи дивно, але вона пов'язана з роботою компілятора JavaScript. Компіляція коду відбувається в два проходи. При першому проході компілятор отримує всі оголошення змінних, всі ідентифікатори. При цьому ніякий код не виконується, методи не викликаються. При другому проході відбувається виконання. І навіть якщо змінна визначена після безпосереднього використання, помилки не виникне, так як при першому проході компілятора вже відомі всі змінні.

Тобто начебто відбувається підняття коду з визначенням змінних і функцій вгору до їх безпосереднього використання. Підняття на англійській перекладається як hoisting, тому даний процес так і називається.

Змінні, які потрапляють під hoisting , отримують значення undefined .

Наприклад, візьмемо наступний найпростіший код:

console.log(foo);

Його виконання викличе помилку ReferenceError: foo is not defined

Додамо визначення змінної:

console.log(foo);   // undefined
var foo = "Tom";

В цьому випадку консоль виведе значення "undefined". При першому проході компілятор дізнається про існування змінної foo . Вона отримує значення undefined . При другому проході викликається метод console.log(foo) .

Візьмемо інший приклад:

var c = a * b;
var a = 7;
var b = 3;
console.log(c); // NaN

Тут та ж ситуація. Змінні a і b використовуються до визначення. За замовчуванням їм присвоюються значення undefined . А якщо помножити undefined на undefined , то отримаємо Not a Number ( NaN ).

Все те ж саме відноситься і до використання функцій. Ми можемо спочатку викликати функцію, а потім вже її визначити:

display();
 
function display(){
    console.log("Hello Hoisting");
}

Тут функція display благополучно спрацює, незважаючи на те, що вона визначена після виклику.

Але від цієї ситуації треба відрізняти той випадок, коли функція визначається у вигляді змінної:

display();
 
var display = function (){
    console.log("Hello Hoisting");
}

В даному випадку ми отримаємо помилку TypeError: display is not a function . При першому проході компілятор також отримає змінну display і прісвоїть їй значення undefined . При другому проході, коли треба буде викликати функцію, на яку буде посилатися ця змінна, компілятор побачить, що викликати то нічого: змінна display поки ще дорівнює undefined . І буде викинута помилка.

Тому при визначенні змінних і функцій слід враховувати нюанси такого аспекту як hoisting .


Наш партнер:
beta test mp3 playlist downloader