如果您在全局范围内,那么差别不大。阅读Kangax 的答案以获得解释

如果你在一个函数中,那么var将创建一个局部变量,“不带 var”将查找作用域链,直到找到变量或到达全局作用域(此时它将创建它)

 

 

有区别

var x = 1 在当前范围内声明变量 x(又名执行上下文)。如果声明出现在函数中 - 声明了一个局部变量;如果它在全局范围内 - 声明一个全局变量。

x = 1另一方面,它仅仅是一个属性分配。它首先尝试解决x作用域链。如果它在该范围链中的任何位置找到它,它就会执行分配;如果它没有找到x,那么它只会在全局对象(它是作用域链中的顶级对象)上创建属性。x

现在,请注意它没有声明一个全局变量,它创建了一个全局属性。

两者之间的区别是微妙的,可能会令人困惑,除非您了解变量声明也会创建属性(仅在变量对象上)并且 Javascript(嗯,ECMAScript)中的每个属性都有某些描述其属性的标志 - ReadOnly、DontEnum 和不要删除。

var x = 1由于变量声明创建带有 DontDelete 标志的属性,和(在全局范围内执行时)之间的区别在于x = 1前者 - 变量声明 - 创建了 DontDelete'able 属性,而后者没有。因此,通过这个隐式赋值创建的属性可以从全局对象中删除,而前一个 - 通过变量声明创建的属性 - 不能被删除。

但这当然只是理论,实际上两者之间存在更多差异,这是由于实现中的各种错误(例如来自 IE 的错误)。

希望这一切都有意义:)


[2010/12/16 更新]

在 ES5(ECMAScript 5;最近标准化,该语言的第 5 版)中有一种所谓的“严格模式”——一种选择性加入的语言模式,它略微改变了未声明赋值的行为。在严格模式下,分配给未声明的标识符是ReferenceError。这样做的基本原理是捕获意外分配,防止创建不需要的全局属性。一些较新的浏览器已经开始滚动支持严格模式。例如,请参阅我的兼容表

javascript带var和不带var声明变量的区别是什么
标签: