JavaScript 提升

在本教程中,你将了解 JavaScript 的提升行为。

什么是变量提升

在 JavaScript 中,所有变量函数声明都被移动或提升到其当前作用域的顶部,无论它在何处定义。这是 JavaScript 解释器的默认行为,称为变量提升。在接下来的部分中,我们将详细介绍它的实际工作原理。

函数提升

使用函数声明定义的函数将自动提升。这意味着它们可以在定义之前被调用。让我们通过一个例子理解这一点:

// Calling function before declaration
sayHello(); // Outputs: Hello, I'm hoisted!

function sayHello() {
    alert("Hello, I'm hoisted!");
}

正如你所看到的,我们在定义 sayHello() 函数之前调用了此函数,但代码仍然有效。这是因为函数声明在后面自动提升到顶部。

变量提升

同样,变量声明也会自动提升到当前作用域的顶部。这意味着如果变量在函数块内声明,它将被移动到函数的顶部,但如果它在任何函数之外声明,它将被移动到脚本的顶部并变为全局可用。看一下下面的例子,看看它是如何工作的:

str = "Hello World!";
alert(str); // Outputs: Hello World!
var str;

但是,JavaScript 仅提升声明,而不是初始化。这意味着如果在使用变量后声明并初始化变量,则该值将为 undefined 。例如:

alert(str); // Outputs: undefined
var str;
str = "Hello World!";

这是演示 JavaScript 的可变提升行为的另一个示例:

var i = 1; // Declare and initialize i
alert(i + ", " + j); // Outputs: 1, undefined
var j = 2; // Declare and initialize j

var x = 5; // Declare and initialize x
var y; // Declare y
alert(x + ", " + y); // Outputs: 5, undefined
y = 10; // Initialize y

var a = 3; // Declare and initialize a
b = 6; // Initialize b
alert(a + ", " + b); // Outputs: 3, 6
var b; // Declare b

var u = 4; // Declare and initialize u
alert(u + ", " + v); // Outputs: 4, undefined
var v; // Declare v
v = 8; // Initialize v

可变提升看起来有点令人困惑,但如果仔细阅读这些例子,你将很容易理解它是如何工作的。

注意: 由于提升行为,最好将变量声明在当前作用域的顶部。此外,在 JavaScript 严格模式下不允许使用不声明的变量。请参阅下一章以了解有关严格模式的更多信息。