目录

JavaScript 提升


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


JavaScript 声明被提升

在 JavaScript 中,变量可以在使用后声明。

换句话说;变量可以在声明之前使用。

示例1给出相同的结果示例2

示例1

x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x;                     // Display x in the element

var x; // Declare x
亲自试一试 »

示例2

var x; // Declare x
x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x;                     // Display x in the element
亲自试一试 »

要理解这一点,您必须理解术语"hoisting"。

提升是 JavaScript 的默认行为,即将所有声明移动到当前作用域的顶部(当前脚本或当前函数的顶部)。


let 和 const 关键字

变量定义为letconst被提升到块的顶部,但不是已初始化

含义:代码块知道该变量,但在声明该变量之前无法使用它。

用一个let声明之前的变量将导致ReferenceError

从块的开头到声明该变量,该变量都位于 "temporal dead zone" 中:

示例

这将导致 ReferenceError
carName = "Volvo";
let carName;
亲自试一试 »

用一个const变量在声明之前是一个语法错误,因此代码将根本无法运行。

示例

该代码将不会运行。

carName = "Volvo";
const carName;
亲自试一试 »

阅读有关 let 和 cons 的更多信息JS 让/常量



JavaScript 初始化未提升

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

示例1不是给出相同的结果示例2

示例1

var x = 5; // Initialize x
var y = 7; // Initialize y

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y;           // Display x and y
亲自试一试 »

示例2

var x = 5; // Initialize x

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y;           // Display x and y

var y = 7; // Initialize y
亲自试一试 »

在最后一个例子中 y 未定义有意义吗?

这是因为只有声明 (var y),而不是初始化 (=7) 被提升到顶部。

由于提升,y 在使用之前已被声明,但由于初始化未提升,因此 y 的值未定义。

示例2与编写相同:

示例

var x = 5; // Initialize x
var y;     // Declare y

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x + " " + y;           // Display x and y

y = 7;    // Assign 7 to y
亲自试一试 »

在顶部声明您的变量!

提升(对于许多开发人员来说)是一种未知或被忽视的 JavaScript 行为。

如果开发人员不了解提升,程序可能会包含错误(错误)。

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

由于这就是 JavaScript 解释代码的方式,因此它始终是一个很好的规则。

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