在JavaScript中,无论定义在何处,所有变量和函数声明都将移动或提升到其当前作用域的顶部。这是JavaScript解释器的默认行为,称为hoisting(提升)。
函数提升(Hoisting)
使用函数声明定义的函数会自动提升。
这意味着可以在定义它们之前调用它们。
// 在声明之前调用函数
greet();
function greet() {
document.getElementById("output").innerHTML = "Hello World";
}
正如您看到的,在定义之前,我们已经调用了greet()函数,但是代码仍然有效。这是因为函数声明在后台自动提升到顶部。
提升是JavaScript将声明移到顶部的默认行为。
JavaScript仅提升声明
JavaScript仅提升声明,而不提升初始化。如果在使用变量后声明并初始化了变量,则该值将是不确定的。
document.write(num); // undefined
var num;
num = 50;
如果在使用变量后声明该变量,但事先对其进行了初始化,它将返回该值:
num = 50;
document.write(num); // 50
var num;
用let或const不声明的变量和常量。
未提升JavaScript初始化
JavaScript仅提升声明,而不提升初始化。
以下两个示例产生不同的结果:
示例1:
var x = 1; // 初始化 x
var y = 2; // 初始化 y
document.write(x + " " + y); // 1 2
示例2:
var x = 1; // 初始化 x
document.write(x + " " + y); // 1 undefined
var y = 2; // 初始化 y
在示例2中,仅将声明(var y)而不是初始化(= 2)提升到顶部。
由于提升,已在使用y之前声明了y,但由于未提升初始化,因此y的值未定义。
上面的示例被隐式理解为:
var x; // 声明 x
var y; // 声明 y
// 提升结束.
x = 1; // 初始化 x
document.write(x + " " + y); // 1 undefined
y = 2; // 初始化 y
始终在顶部声明变量
提升(Hoisting)是JavaScript的未知或被忽略的行为。
如果您不懂提升(Hoisting),程序可能包含错误。
为避免错误,请始终在每个作用域的开头声明所有变量。
注意:如果未声明变量,则严格模式下的JavaScript不允许使用变量。
您将"use strict"在下一章中了解更多信息。