JavaScript 提升

提升是 JavaScript 将声明移到顶部的默认行为。

提升是 JavaScript 将声明移到顶部的默认行为。

JavaScript 声明被提升

在 JavaScript 中,变量可以在使用后声明。换句话说:变量可以在声明之前使用。

下面两个示例的效果一样。

变量在声明之前使用:

x = 5; // x 赋值为 5
elem = document.getElementById("demo"); // 查找一个元素
elem.innerHTML = x; // // 在元素中显示 x
var x; // 声明 x 变量

先声明再使用变量:

var x; // 声明 x 变量
x = 5; // x 赋值为 5
elem = document.getElementById("demo"); // 查找一个元素
elem.innerHTML = x; // 在元素中显示 x

要理解这一点,需要了解“提升”一词。提升是 JavaScript 的默认行为,将所有声明移动到当前作用域的顶部(移动到当前脚本或当前函数的顶部)。

let 和 const

letconst 定义的变量不能在声明之前使用。

声明之前 let 变量将导致 ReferenceError

carName = "Volvo";
let carName;

在声明之前使用 const 变量是语法错误:

carName = "Volvo";
const carName;

可在 JavaScript let 章节和 JavaScript const 章节了解有关 let 和 const 的更多信息。

未提升 JavaScript 初始化

JavaScript 只提升声明,而不是初始化。

下面示例 1 和 示例 2 的结果并不相同。

示例 1:

var x = 5; // 初始化 x
var y = 7; // 初始化 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y

示例 2:

var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; /// 显示 x 和 y
var y = 7; // 初始化 y

为什么会出现这样的差异?这是因为只有声明 (var y) 被提升到顶部,初始化 (= 7) 不会被提升。

下面的示例相当于示例 2 提升后的代码:

var x = 5; // 初始化 x
var y; // 声明 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
y = 7; // 给 y 赋值 7

在顶部声明您的变量!

对许多开发人员而言,JavaScript 提升是一种未知或被忽视的行为。如果开发人员不了解提升,则程序可能包含错误(错误)。

为避免错误,请始终在每个作用域的开头声明所有变量。

JavaScript 是一种解释性的语言,坚持在使用变量前声明变量是一个很好的习惯。

严格模式下的 JavaScript 不允许使用未声明的变量。在下一章学习使用 JavaScript 严格模式