Hoisting (поднятие) в js. Сравнение var, let, const, function, class

Откуда вообще это странное слово hoisting? В русской документации оно чаще всего употребляется как “поднятие” или “всплывание”. От англ. hoist = rais = lift = поднимать.

Function Hoisting

printHello();
// hello

function printHello() {
  console.log("hello")
}

Прежде чем интерпретатор выполнит весь код, он сначала поднимает (поднимает) объявленную функцию на вершину области, в которой она определена. В этом случае она определена printHelloв глобальной области видимости, поэтому функция поднимается наверх. глобального масштаба.
Функция поднимается (hoisting) только до верха области видимости, в которой он был объявлен.

Variable Hoisting

VAR

При поднятии значение по умолчанию = undefined (переменная проинициализирована)

console.log(name) //undefined
var name = "Serge"
console.log(name) //Serge

!!! И вот тут интересный момент! Размещаем этот скрипт в самом корне, и…
1. Если попробуйте выполнить вот этот код в браузере , то у вас отобразиться в первый раз (Открывайте страницу в инкогнито. Галочка с очисткой кеша в открытой консоли разработчика в Хроме тут не поможет): пустая строка, Serge. а потом, и во все последующие обновления страницы; Serge, Serge.
2. Если вы выполните в командной строке через node script.js. то будет как и показано в примере: undefined, Serge.

Если мы обернем этот пример в функцию и вызовем ее, то результат будет идентичен в браузере и в Node.
Если вы хотите завалить и озадачить кого-то, в том числе на собеседовании по javascript – вот отличная задача для этого!

LET, CONST

При поднятии значение по умолчанию никакое не присваивается (переменная не проинициализирована), но поднятие-hoisting происходит). И интерпретатор знает о нашей переменной!

console.log(name)
// ReferenceError: Cannot access 'name' before initialization
let name = "Serge"

Переменные поднимаются в начало области, в которой они объявлены (локальной, глобальной или блочной), но недоступны, поскольку не были инициализированы. Эту концепцию также называют временной мертвой зоной (temporal dead zone).

CLASS Hoisting

Аналогичная ситуация происходит и с классами, к в let и const.

const Dog = new Animal("Bingo")
// ReferenceError: Cannot access 'Animal' before initialization

class Animal {
  constructor(name) {
    this.name = name
  }
}

Данная статья – краткая выдержка на основе https://www.freecodecamp.org/news/what-is-hoisting-in-javascript-3/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *