在 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 中,变量提升的行为取决于变量是使用 var
、let
还是 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' 进行变量提升
当我们使用 let
或 const
声明变量时,它会被提升到其当前作用域的顶部。但是,与使用 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
,因为在初始化之前就打印了它。
另请阅读