JavaScript基础教程

JavaScript 对象

JavaScript 函数

JS HTML DOM

JS 浏览器BOM

AJAX 基础教程

JavaScript 参考手册

JavaScript 提升(Hoisting)

在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;
测试看看‹/›

letconst不声明的变量和常量。

未提升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"在下一章中了解更多信息。