Первоначально опубликовано 24 декабря 2019 г.
Поднятие — когда вы вызываете функцию или переменную в строке над строкой, где она определена.
Декларация Var поднимается, но не присваивается
function sayVar() {
console.log('My name is', theName)
var theName = 'Jane Doe'
}
Это возвращает при вызове «Мое имя не определено».
Объявление theName сохраняется в памяти, когда движок Javascript выполняет свой первый проход по коду; но еще не присваивает ему значение. Когда движок Javascript выполняет второй запуск и достигает строки, где мы вызываем console.log('My name is', theName); theName объявляется, но не назначается; поэтому он просто оценивается как «неопределенный». Это не вызывает ошибки и поэтому может остаться незамеченным.
Let и Const не поднимают
function sayConst() { console.log('My name is', theName) const theName = 'Jane Doe' }
function sayLet() { console.log('My name is', theName) let theName = 'Jane Doe' }
Обе следующие функции при вызове возвращают ReferenceError: имя не определено.
Поскольку они выдают ошибку, еще не определенная природа theName становится более очевидной, чем если бы мы объявили переменную с помощью var.
Объявления функций DO подъемник
function sayFunction() {
console.log('My name is', theName())
function theName() {
const name = 'Jane Doe'
return name
}
}
Это возвращает, когда вызывается: «Меня зовут Джейн Доу». — показывая, что когда мы объявляем память с помощью ключевого слова function, движок Javascript сохраняет ссылку на память даже при первом «компиляции» кода.
Обычный шаблон проектирования, который я видел в коде, заключается в том, чтобы определить основную функцию программы в верхней части файла или вызвать функции, составляющие основную программу, в верхней части, а затем определить эти функции-компоненты ниже; ПОСЛЕ их вызова. Причина, по которой это может работать, заключается в том, что они объявлены с ключевым словом function.
Пример этого шаблона проектирования
const mainProgram = function() { function1(); function2(); }
function function1() { console.log(1) }
function function2() { console.log(2) }
// 1 // 2
Анонимные функции, назначенные переменным с Let или Const, НЕ поднимаются
function sayConstAnonFunction() {
console.log('My name is', theName)
const theName = function() {
theName = 'Jane Doe'
}
}
Это возвращает при вызове ReferenceError: имя не определено.
Функции, объявленные с помощью ключевого слова function, и функции, объявленные с помощью ключевого слова const, ведут себя одинаково, за исключением того, что функции, объявленные с помощью ключевого слова const, не поднимаются. Я подумал, что это очень интересно — тот же шаблон проектирования, что и выше, не работает, если его функции объявлены с ключевым словом const.
На самом деле шаблон проектирования работает при определенных обстоятельствах — причина, по которой я был заинтересован в тестировании этих различных случаев, заключается в разговоре, который у меня был с Нэнси во время обзора моего проекта.
Шаблон проектирования будет работать, если основная программа, которая вызывает функции компонента, вызывается только в зависимости от срабатывания прослушивателя событий — простой пример — «щелчок». К тому времени, когда вы взаимодействуете с элементом в DOM, Javascript наверняка объявил и присвоил значения этим константным переменным, верно? Это также работает, если вы прослушиваете событие DOMContentLoaded. За те доли секунды, которые требуются для загрузки DOM, Javascript подготовил в своей памяти те функции, которые вы объявили с помощью const.
document.addEventListener('DOMContentLoaded', () => { function1(); function2(); });
const function1 = function() { console.log(1); };
const function2 = function() { console.log(2); };
Какой вывод здесь? Лично я сейчас склоняюсь к назначению функций с помощью ключевого слова const — я думаю, что может быть немного сложнее убедиться, что порядок загрузки правильный, но оно того стоит. Не говоря уже о том, что поскольку const имеет блочную область видимости, сущности не используют функции, не предназначенные для решения их собственных задач.