В этой статье я максимально просто объясню, что такое подъем JavaScript. Если вы используете JavaScript, это определенно будет полезно узнать, также, если вы подаете заявку на какую-либо позицию JavaScript, этот вопрос, скорее всего, будет задан. Крайне важно знать основы разработки, поэтому это обязательно принесет вам пользу, поэтому я рекомендую вам потратить следующие 10 минут, чтобы действительно глубоко понять их.
Определение подъема
Подъем - это действие интерпретатора Javascript для перемещения всех объявлений переменных и функций в верхнюю часть текущей области.
Возможно, вы слышали, что объявления переменных и функций перемещены вверх, и чтобы понять, как интерпретируется код, это неплохое мнение, но также важно знать, что на самом деле происходит , и вот она:
Интерпретатор JavaScript на самом деле не перемещает код, он сохраняет объявления переменных и функций в памяти во время компиляции.
Теперь, когда вы знаете определение, давайте посмотрим на код, чтобы вы лучше его поняли.
Переменные
Итак, давайте посмотрим на этот пример:
console.log(a);
Одно это вызовет следующую ошибку:
"ReferenceError: a is not defined at hacidorofu.js:1:43 at https://static.jsbin.com/js/prod/runner-4.1.4.min.js:1:13924 at https://static.jsbin.com/js/prod/runner-4.1.4.min.js:1:10866"
Это говорит само за себя, переменная не определена, давайте посмотрим на этот код:
console.log(a); // undefined var a = 5;
Теперь написано undefined, без ошибок. Значит, неопределенный и не определенный - это не одно и то же.
a не определено - означает, что переменная не существует
undefined - означает, что переменная существует, но не определена, у нее нет значения
Это подъем в действии. вот что произошло:
Ваш код:
console.log(a); // undefined var a = 5;
Как это видит интерпретатор JavaScript:
var a; console.log(a); // undefined a = 5;
Таким образом, JavaScript поднял объявление (var a), а не инициализацию (= 5). Итак, еще раз:
В JavaScript размещаются только объявления, а не инициализации.
Давайте посмотрим на другой пример, чтобы убедиться, что он понятен:
console.log(a); // undefined var a = 5; console.log(a); // 5
Функции
С функцией все очень похоже, давайте посмотрим на этот пример:
sayHi(); // Hi! function sayHi() { console.log('Hi!'); }
Таким образом, объявление функции поднимается наверх. Что произойдет, если мы определим переменную как эту функцию?
sayHi(); // TypeError: sayHi is not a function var sayHi = function() { console.log('Hi!'); }
Это потому, что интерпретатор «переместил» объявление вверху:
var sayHi; sayHi(); // TypeError: sayHi is not a function sayHi = function() { console.log('Hi!'); }
Итак, в этом примере факт остается неизменным: JavaScript-хосты только объявления, а не инициализации.
Лучшие практики
- Объявите все переменные и функцию в верхней части области видимости. Это лучший метод, упомянутый в книге Дугласа Крокфорда «JavaScript: хорошие стороны».
- В ES6 у нас есть const и let, если вы используете ES6, используйте их вместо var, потому что они не поднимаются. С var вам нужно быть более осторожным и иметь в виду подъем. Это будет удобно, если вам нужно будет поддерживать очень старое приложение JavaScript, в котором нет const и let.