JavaScript 提升

在 JavaScript 中,变量提升是一种允许在声明之前使用函数或变量的行为。

下面是 JavaScript 变量提升的一个简单示例。请阅读教程的其余部分以了解更多信息。

示例

// use test variable before declaring console.log(test);
// declare and initialize test variable var test = 5; // Output: undefined

在这里,由于变量提升,我们可以在声明变量 test 之前使用它。但是,由于在打印变量时它尚未初始化,因此输出为 undefined


JavaScript 中的变量提升

JavaScript 中通常有两种类型的变量提升:

  • 变量提升
  • 函数提升

让我们详细了解其中的每一种。


变量提升

在 JavaScript 中,变量提升的行为取决于变量是使用 varlet 还是 const 声明的。

使用 'var' 进行变量提升

当我们使用 var 声明变量时,它会被提升到其当前作用域的顶部。例如:

// use the message variable before declaration
console.log(message);

// variable declaration using var keyword
var message;

// Output: undefined

在上面的示例中,我们可以在声明变量 message 之前使用它。这是因为变量被提升了,并具有默认值 undefined

因此,上面的程序等同于:

var message;
console.log(message);

// Output: undefined

使用 'let' 和 'const' 进行变量提升

当我们使用 letconst 声明变量时,它会被提升到其当前作用域的顶部。但是,与使用 var 声明的变量不同,提升的变量没有默认值。

让我们看下面的示例。

// use the message variable before declaration
console.log(message);

// variable declaration using let keyword
let message;

输出

ReferenceError: Cannot access 'message' before initialization

这里会发生错误,因为使用 let 声明的变量在提升时没有被分配任何默认值。

注意:我们知道变量 message 被提升了,因为错误消息 "Cannot access 'message' before initialization" 表明 JavaScript 知道 message 存在。

如果变量没有被提升,我们会得到一个不同的错误,即 ReferenceError: message is not defined


函数提升

在 JavaScript 中,函数提升允许我们在函数声明之前调用该函数。

// function call greeting();
// function declaration function greeting() { console.log("Welcome to Programiz."); }

输出

Welcome to Programiz.

在上面的示例中,由于变量提升,我们可以在声明 greeting() 之前调用它。

函数内的变量提升。

在 JavaScript 中,变量仅会被提升到其当前作用域的顶部。让我们看看这是如何在函数内部工作的:

function greet() {
    message = "hello";
    // use the variable message before declaration
    console.log(message); 
    var message;
}

greet();

// attempt to access message outside the function
console.log(message);

输出

hello
ERROR!
... ... ...
ReferenceError: message is not defined

在上面的示例中,变量 message 被提升到了 greet() 函数的顶部,并成为一个局部变量。

但是,当我们尝试在函数外部访问 message 时,我们会收到一个错误,因为变量仅被提升到函数顶部,而不是全局作用域。

注意:要了解有关局部变量和全局变量的更多信息,请访问 JavaScript 变量作用域

函数表达式不会被提升。

当我们使用函数表达式时,不能在声明之前调用它。例如:

// call greet() function before declaration
greet();

// function expression
var greet = function() {
    console.log("Programiz");
}

输出

TypeError: greet is not a function

初始化不会被提升

JavaScript 在代码运行前会将变量的声明移到其作用域的顶部。

但是,初始化部分保留在代码的原始位置。例如:

// display number
console.log(number);
var number = 5;

// Output: undefined

上述程序等同于

var number;
console.log(number);
number = 5;

如您所见,只有声明被移到了顶部。

因此,变量 number 的值是 undefined,因为在初始化之前就打印了它。

注意事项:

  • 通常,变量提升在其他编程语言(如 PythonCC++Java)中是不存在的。
  • 变量提升可能会导致程序中出现不良结果。因此,最好避免这种做法。

另请阅读

在我们结束之前,让我们通过以下挑战来测试您对 JavaScript 变量提升的知识!您能解决这个挑战吗?

挑战

编写一个函数来计算一个数字的阶乘。

  • 非负整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。
  • 例如,3 的阶乘是 3 * 2 * 1 = 6
  • 返回输入数字 num 的阶乘
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战