JavaScript中var声明与隐式全局变量的区别

作者:纸飞机时间:2026-10-27 09:34:08浏览:131

在JavaScript中,使用var声明变量与直接赋值存在本质区别。var创建的是具有不可删除属性的局部或全局变量,而省略var会尝试在当前作用域链查找,若未找到则在全局对象(如window)上创建属性。该属性可被删除,且ES5严格模式下未声明赋值会抛出错误,从而避免意外的全局污染。

var声明与直接赋值的机制差异

在JavaScript中声明变量时,即便使用var关键字与不使用关键字的代码往往都能正常运行,但两者在机制上存在显著差异。代码能运行并不代表其写法是规范或合适的。例如:var num = 1;

使用var关键字是在当前作用域中声明变量。如果该声明位于函数内部,则变量为局部变量;如果位于全局作用域,则变量为全局变量。

而直接写 num = 1;

这实际上是一个属性赋值操作。JavaScript引擎会首先尝试在当前作用域链(若处于函数内,则包括全局作用域及函数局部作用域等)中解析标识符num。如果找到该标识符,则执行赋值;如果未找到,则会在最顶层的全局对象(即window对象)中创建名为num的属性并赋值。

需要注意的是,这并非声明了一个全局变量,而是创建了一个全局对象的属性。

尽管“变量声明”与“创建对象属性”看似相似,但它们在JavaScript内部机制中拥有不同的属性标志,例如只读(ReadOnly)、不可枚举(DontEnum)和不可删除(DontDelete)等。

因变量声明隐含不可删除特性,对比 var num = 1 与 num = 1,前者属变量声明,具不可删除特性,故不可被删除;后者为全局变量属性,可从全局变量中移除。

变量属性与删除行为的代码验证

具体行为可通过以下代码验证:

代码如下:

// num1为全局变量,num2为window的一个属性
var num1 = 1;
num2 = 2;
// delete num1; 无法删除
// delete num2; 删除
function model(){
var num1 = 1; // 本地变量
num2 = 2; // window的属性
// 匿名函数
(function(){
var num = 1; // 本地变量
num1 = 2; // 继承作用域(闭包)
num3 = 3; // window的属性
                            }())
                     }

ES5严格模式对隐式全局变量的限制

PS. 在ECMAScript5标准中,有一种“严格模式”(Strict Mode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,因此可以防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

作者最新文章