Подъем - это поведенческая концепция JavaScript.Подъем (скажем, перемещение) - это концепция, которая объясняет, как и где переменные должны быть объявлены.
В JavaScript переменная может быть объявлена после того, как она была использована, поскольку объявления функций и объявления переменных всегда незаметно перемещаются («поднимаются») в верхнюю часть их содержащей области видимости интерпретатором JavaScript.
В большинстве случаев мы встречаемся с двумя типами подъема.
1.Переменная декларация подъема
Позволяет понять это по коду.
a = 5; // Assign 5 to a
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = a; // Display a in the element
var a; // Declare a
//output-> 5
Здесь объявление переменной a будет размещено сверху невидимым интерпретатором javascript во время компиляции.Таким образом, мы смогли получить значение.Но такой подход объявления переменных не рекомендуется, так как мы должны объявить переменные top уже как этот.
var a = 5; // Assign and declare 5 to a
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = a; // Display a in the element
// output -> 5
рассмотрим другой пример.
function foo() {
console.log(x)
var x = 1;
}
фактически интерпретируется так:
function foo() {
var x;
console.log(x)
x = 1;
}
В этом случае x будет неопределенным
Не имеет значения, был ли выполнен код, содержащий объявление переменной.Рассмотрим этот пример.
function foo() {
if (false) {
var a = 1;
}
return;
var b = 1;
}
Эта функция выглядит следующим образом.
function foo() {
var a, b;
if (false) {
a = 1;
}
return;
b = 1;
}
В объявлении переменной поднимается только определение переменной, а не присвоение.
Подъем объявления функции
В отличие от подъема переменной, тело функции или присвоенное значение также будут подняты.Рассмотрим этот код
function demo() {
foo(); // this will give error because it is variable hoisting
bar(); // "this will run!" as it is function hoisting
var foo = function () {
alert("this would not run!!");
}
function bar() {
alert("this will run!!");
}
}
demo();
Теперь, когда мы поняли как переменные, так и функции, давайте разберемся с этим кодом.
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
Этот код окажется таким.
var a = 1; //defines "a" in global scope
function b() {
var a = function () {}; //defines "a" in local scope
a = 10; //overwrites local variable "a"
return;
}
b();
alert(a);
Функция a () будет иметь локальную область видимости внутри b ().a () будет перемещаться наверх при интерпретации кода с его определением (только в случае поднятия функции), так что теперь у него будет локальная область видимости, и, следовательно, он не будет влиять на глобальную область видимости, имея собственную область видимости внутри функции b ()..