JavaScript 中存在变量提升和函数提升,它们是由 JavaScript 解释器在代码执行之前进行的一种行为。
最新的 ECMAScript 标准定义了 8 种数据类型:
true
?和?false
。null
?与?Null
、NULL
或变体完全不同。42
?或者?3.14159
。"Howdy"
。在 JavaScript 中,使用 var
声明的变量会被提升到其所在作用域的顶部。这意味着可以在变量声明之前引用变量,而不会导致 ReferenceError。
console.log(x); // 输出: undefined
var x = 5;
console.log(x); // 输出: 5
实际上,上述代码在执行时会被解释器处理成如下形式:
var x;
console.log(x); // 输出: undefined
x = 5;
console.log(x); // 输出: 5
值得注意的是,变量提升只提升声明,而不提升赋值。变量的初始化赋值仍然保留在原始位置。
在 JavaScript 中,使用 function
声明的函数会被整体提升到其所在作用域的顶部。这意味着可以在函数声明之前调用函数,而不会导致 ReferenceError。
sayHello(); // 输出: "Hello!"
function sayHello() {
console.log("Hello!");
}
实际上,上述代码在执行时会被解释器处理成如下形式:
function sayHello() {
console.log("Hello!");
}
sayHello(); // 输出: "Hello!"
与变量提升类似,函数提升也只提升声明,不提升具体的函数实现。因此,在函数声明之前调用函数是有效的。
let
和 const
声明的变量也存在提升,但它们不会被初始化为 undefined
,而是保持在 "暂时性死区"(Temporal Dead Zone,TDZ)中。console.log(x); // Uncaught ReferenceError: Cannot access 'x' before initialization
let x = 3;
var
、let
、或 const
声明的函数)的提升行为与函数声明略有不同,它们会被提升,但初始化的赋值不会提升。 baz(); // Uncaught TypeError: baz is not a function
var baz = function () {
console.log("bar2");
};