ZetCode

JavaScript var 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 JavaScript 中的 var 关键字声明变量。 我们将介绍基本用法、变量提升和作用域规则。

var 关键字

var 关键字用于在 JavaScript 中声明变量。 在 ES6 引入 letconst 之前,这是声明变量的原始方法。 使用 var 声明的变量具有函数作用域。

letconst 不同,var 声明会被提升到其作用域的顶部。 这意味着您可以在变量声明之前使用它。 然而,只有声明被提升,初始化不会被提升。

var 声明的变量可以在其作用域内重新声明和更新。 当在任何函数之外声明时,它们也会附加到全局对象。 这种行为与现代变量声明不同。

基本变量声明

以下示例演示了 var 关键字用于声明变量的基本用法。

main.js
var message = "Hello, World!";
console.log(message);

var count = 10;
count = 20;
console.log(count);

在这里,我们使用 var 声明了两个变量。 第一个保存一个字符串,第二个保存一个数字,我们稍后会更新它。 使用 var 声明的变量可以被重新赋值新值。 控制台输出显示了两个变量的值。

$ node main.js
Hello, World!
20

变量提升

使用 var 声明的变量会被提升到它们的作用域的顶部。

main.js
console.log(name); // undefined
var name = "John Doe";
console.log(name); // John Doe

此示例演示了变量提升。 我们可以引用 name 在其声明之前,但它的值是 undefined,直到赋值。 声明被移到顶部,但初始化发生在书写的地方。

$ node main.js
undefined
John Doe

函数作用域

使用 var 声明的变量具有函数作用域,而不是块作用域。

main.js
function testScope() {
    if (true) {
        var x = 10;
    }
    console.log(x); // 10
}
testScope();

变量 x 可以在 if 块之外访问,因为 var 声明具有函数作用域。 这与具有块作用域的 letconst 不同。 变量存在于整个函数中。

$ node main.js
10

全局作用域

当在任何函数之外声明时,var 变量将变为全局变量。

main.js
var globalVar = "I'm global";

function checkGlobal() {
    console.log(globalVar); // Accessible
}

checkGlobal();
console.log(globalVar); // Also accessible
console.log(window.globalVar); // In browsers

这展示了一个全局变量声明。 它可以在代码中的任何地方访问。 在浏览器环境中,全局 var 变量成为 window 对象的属性。 这不会发生在 letconst 上。

$ node main.js
I'm global
I'm global
undefined

重新声明

使用 var 声明的变量可以在同一作用域内重新声明。

main.js
var counter = 5;
console.log(counter);

var counter = 10; // Redeclaration allowed
console.log(counter);

此示例显示了变量的重新声明。 使用 var,这不会导致错误,这与使用 letconst 不同。 第二个声明只是更新了变量的值。

$ node main.js
5
10

没有块作用域

使用 var 声明的变量不尊重块作用域。

main.js
for (var i = 0; i < 3; i++) {
    console.log(i);
}
console.log("After loop:", i); // Still accessible

变量 i 在循环之后仍然可以访问,因为 var 不尊重块作用域。 在某些情况下,这可能会导致意外行为。 现代 JavaScript 更喜欢使用 let 作为循环计数器来避免此问题。

$ node main.js
0
1
2
After loop: 3

立即调用函数表达式 (IIFE)

IIFE 通常与 var 一起使用以创建私有作用域。

main.js
(function() {
    var privateVar = "I'm private";
    console.log(privateVar);
})();

// console.log(privateVar); // Would throw ReferenceError

此 IIFE 为 privateVar 创建了一个新的作用域。 在块作用域变量之前,此模式用于避免污染全局命名空间。 变量无法在函数外部访问。

$ node main.js
I'm private

来源

var - 语言参考

在本文中,我们已经演示了如何使用 var 关键字在 JavaScript 中声明变量,涵盖了它的独特特性和行为。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有十多年教授编程的经验。

查看 所有 JavaScript 教程。