JavaScript 提升
提升是 JavaScript 将声明移动到顶部的默认行为。
JavaScript 声明被提升
在 JavaScript 中,变量可以在使用之前声明。
换句话说,变量可以在声明之前使用。
示例 1 与 示例 2 的结果相同
示例 1
x = 5; // 将 5 赋值给 x
elem = document.getElementById("demo"); // 找到一个元素
elem.innerHTML = x; // 在元素中显示 x
var x; // 声明 x
尝试一下 »
示例 2
var x; // 声明 x
x = 5; // 将 5 赋值给 x
elem = document.getElementById("demo"); // 找到一个元素
elem.innerHTML = x; // 在元素中显示 x
尝试一下 »
要理解这一点,您必须理解术语“提升”。
提升是 JavaScript 将所有声明移动到当前作用域顶部的默认行为(移动到当前脚本或当前函数的顶部)。
let 和 const 关键字
使用 let
和 const
定义的变量会被提升到代码块的顶部,但不会被初始化。
这意味着:代码块知道这个变量,但在它被声明之前不能使用它。
在声明之前使用 let
变量会导致 ReferenceError
。
变量处于从代码块开始到它被声明之前的“暂时性死区”
在声明之前使用 const
变量是语法错误,因此代码将无法运行。
在 JS Let / 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
尝试一下 »
在最后一个示例中,y 未定义有道理吗?
这是因为只有声明(var y),而不是初始化(=7)被提升到顶部。
由于提升,y 在使用之前已经被声明,但由于初始化不被提升,所以 y 的值为 undefined。
示例 2 等同于编写
示例
var x = 5; // 初始化 x
var y; // 声明 y
elem = document.getElementById("demo"); // 找到一个元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
y = 7; // 将 7 赋值给 y
尝试一下 »
在顶部声明您的变量!
提升是 JavaScript 的一种(对许多开发人员来说)未知或被忽视的行为。
如果开发人员不理解提升,程序可能会包含错误(错误)。
为了避免错误,始终在每个作用域的开头声明所有变量。
由于这是 JavaScript 解释代码的方式,因此这是一个很好的规则。
在严格模式下,JavaScript 不允许使用未声明的变量。
在下一章中学习“use strict”。