提升是 JavaScript 将声明移动到顶部的默认行为。
在 JavaScript 中,变量可以在使用后声明。
换句话说;变量可以在声明之前使用。
示例1给出相同的结果示例2:
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
亲自试一试 »
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
被提升到块的顶部,但不是已初始化。
含义:代码块知道该变量,但在声明该变量之前无法使用它。
用一个let
声明之前的变量将导致ReferenceError
。
从块的开头到声明该变量,该变量都位于 "temporal dead zone" 中:
用一个const
变量在声明之前是一个语法错误,因此代码将根本无法运行。
阅读有关 let 和 cons 的更多信息JS 让/常量。
JavaScript 仅提升声明,而不提升初始化。
示例1做不是给出相同的结果示例2:
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
亲自试一试 »
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"在下一章中。
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!