В этой статье я максимально просто объясню, что такое подъем 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-хосты только объявления, а не инициализации.

Лучшие практики

  1. Объявите все переменные и функцию в верхней части области видимости. Это лучший метод, упомянутый в книге Дугласа Крокфорда «JavaScript: хорошие стороны».
  2. В ES6 у нас есть const и let, если вы используете ES6, используйте их вместо var, потому что они не поднимаются. С var вам нужно быть более осторожным и иметь в виду подъем. Это будет удобно, если вам нужно будет поддерживать очень старое приложение JavaScript, в котором нет const и let.