JavaScript var 关键字
最后修改于 2025 年 4 月 16 日
在本文中,我们将展示如何使用 JavaScript 中的 var
关键字声明变量。 我们将介绍基本用法、变量提升和作用域规则。
var 关键字
var
关键字用于在 JavaScript 中声明变量。 在 ES6 引入 let
和 const
之前,这是声明变量的原始方法。 使用 var
声明的变量具有函数作用域。
与 let
和 const
不同,var
声明会被提升到其作用域的顶部。 这意味着您可以在变量声明之前使用它。 然而,只有声明被提升,初始化不会被提升。
用 var
声明的变量可以在其作用域内重新声明和更新。 当在任何函数之外声明时,它们也会附加到全局对象。 这种行为与现代变量声明不同。
基本变量声明
以下示例演示了 var
关键字用于声明变量的基本用法。
var message = "Hello, World!"; console.log(message); var count = 10; count = 20; console.log(count);
在这里,我们使用 var
声明了两个变量。 第一个保存一个字符串,第二个保存一个数字,我们稍后会更新它。 使用 var
声明的变量可以被重新赋值新值。 控制台输出显示了两个变量的值。
$ node main.js Hello, World! 20
变量提升
使用 var
声明的变量会被提升到它们的作用域的顶部。
console.log(name); // undefined var name = "John Doe"; console.log(name); // John Doe
此示例演示了变量提升。 我们可以引用 name
在其声明之前,但它的值是 undefined
,直到赋值。 声明被移到顶部,但初始化发生在书写的地方。
$ node main.js undefined John Doe
函数作用域
使用 var
声明的变量具有函数作用域,而不是块作用域。
function testScope() { if (true) { var x = 10; } console.log(x); // 10 } testScope();
变量 x
可以在 if 块之外访问,因为 var
声明具有函数作用域。 这与具有块作用域的 let
和 const
不同。 变量存在于整个函数中。
$ node main.js 10
全局作用域
当在任何函数之外声明时,var
变量将变为全局变量。
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
对象的属性。 这不会发生在 let
或 const
上。
$ node main.js I'm global I'm global undefined
重新声明
使用 var
声明的变量可以在同一作用域内重新声明。
var counter = 5; console.log(counter); var counter = 10; // Redeclaration allowed console.log(counter);
此示例显示了变量的重新声明。 使用 var
,这不会导致错误,这与使用 let
或 const
不同。 第二个声明只是更新了变量的值。
$ node main.js 5 10
没有块作用域
使用 var
声明的变量不尊重块作用域。
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
一起使用以创建私有作用域。
(function() { var privateVar = "I'm private"; console.log(privateVar); })(); // console.log(privateVar); // Would throw ReferenceError
此 IIFE 为 privateVar
创建了一个新的作用域。 在块作用域变量之前,此模式用于避免污染全局命名空间。 变量无法在函数外部访问。
$ node main.js I'm private
来源
在本文中,我们已经演示了如何使用 var 关键字在 JavaScript 中声明变量,涵盖了它的独特特性和行为。