JavaScript全局变量:使用'var'和不使用'var'的区别

13

可能是重复问题:
JavaScript中使用var和不使用var的区别

我明白在函数中定义本地变量时应该始终使用'var'。

当我定义全局函数时,使用'var'有什么区别?

我在互联网上看到一些代码示例使用了

var globalVar = something;
globalVar = something;

有什么区别吗?


1
这不是重复的问题。这个问题特别涉及到全局范围。我先找到了“重复问题”,它没有回答我的问题,然后我找到了这个问题,我的问题得到了解答。 - Goose
2个回答

25

从技术上讲,一个简单赋值操作如globalVar = 'something';并不会声明一个变量,它只是在全局对象上创建了一个属性,由于全局对象是作用域链中的最后一个对象,因此可以解析。

另一个区别在于绑定方式,变量是作为其环境记录的"不可删除"属性进行绑定的,例如:

var global1 = 'foo';
delete this.global1; // false

global2 = 'bar';
delete this.global2; // true

我强烈建议您始终使用var语句。例如,您的代码将在ECMAScript 5严格模式下出现问题,因为不允许对未声明的标识符进行赋值,以避免隐式全局变量。


5
简短版:在全局上下文中没有区别。
长版:对于全局上下文,变量对象就是全局上下文本身。这就是为什么我们可以在函数或eval上下文中直接访问全局变量和方法。然而,var语句只确保你在当前上下文中定义了一个变量,在全局上下文中省略它没有任何区别。例外情况:ES5严格模式将在看到没有var声明时可能会抛出错误。
**唯一的区别在于,var声明的变量在当前(执行)上下文中没有定义。这发生在JS解析时间,所以引擎知道在上下文中有一个具有该名称的变量可用。省略var将导致从全局对象进行直接属性访问。

1
不完全正确: alert(globalVar); globalVar = something; 会因为JS编译变量的方式而抛出错误。在第二行之前添加 var,你只会得到 "undefined"。 - user578895
@cwolves:没错,但我的回答仍然是正确的。var关键字只会在解析时在当前上下文中神奇地“声明”一个变量,而没有任何定义。 - jAndy
1
不,答案“没有区别”是不正确的,这基本上就是你原来回答的全部内容 :) - user578895
@cwolves:我添加了细则:p - jAndy
那个打印太大了,我认为你需要<sub><sup> - user113716

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接