在JavaScript中,无论定义在何处,所有变量和函数声明都将移动或提升到其当前作用域的顶部。这是JavaScript解释器的默认行为,称为hoisting(提升)。
使用函数声明定义的函数会自动提升。
这意味着可以在定义它们之前调用它们。
// 在声明之前调用函数 greet(); function greet() { document.getElementById("output").innerHTML = "Hello World"; }测试看看‹/›
正如您看到的,在定义之前,我们已经调用了greet()函数,但是代码仍然有效。这是因为函数声明在后台自动提升到顶部。
提升是JavaScript将声明移到顶部的默认行为。
JavaScript仅提升声明,而不提升初始化。如果在使用变量后声明并初始化了变量,则该值将是不确定的。
document.write(num); // undefined var num; num = 50;测试看看‹/›
如果在使用变量后声明该变量,但事先对其进行了初始化,它将返回该值:
num = 50; document.write(num); // 50 var num;测试看看‹/›
JavaScript仅提升声明,而不提升初始化。
以下两个示例产生不同的结果:
var x = 1; // 初始化 x var y = 2; // 初始化 y document.write(x + " " + y); // 1 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"在下一章中了解更多信息。