如果你在全球范围内,则没有太大区别.阅读Kangax的答案进行解释
如果你在函数中,那么var
将创建一个局部变量,"no var"将查找作用域链,直到它找到变量或命中全局作用域(此时它将创建它):
// These are both globals var foo = 1; bar = 2; function() { var foo = 1; // Local bar = 2; // Global // Execute an anonymous function (function() { var wibble = 1; // Local foo = 2; // Inherits from scope above (creating a closure) moo = 3; // Global }()) }
如果你没有做任务,那么你需要使用var
:
var x; // Declare x
嗯,实际上是的,有区别:)这个差异是否重要是另一个问题.请进一步查看我的答案:http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript#answer-1471738 (65认同)
"没有太大区别"=="没有差异"? (31认同)
就像用铁轨枪射击自己一样......忘记在一个变量之前加上'var',最后修改范围链中某个变量**尝试说服Java/C/Python等.开发人员认为JavaScript是值得的.哈!相比之下,C/C++陷阱看起来很不错.想象一下,必须调试JavaScript ......当然,有些人会这样做.用JavaScript编写的代码很多(而不是简单的代码,请注意)... (18认同)
_如果你在全球范围内,则没有区别._ >>有一个区别在下面的答案中解释 (6认同)
我认为这可能是亚历克斯的观点,这就是为什么他用"等于"运算符写它的原因! (4认同)
@Alex 0 == false,所以是"没有太大区别"=="没有差异"然而"没有太大区别"!=="没有区别" (3认同)
kangax.. 733
有区别.
var x = 1
声明 x
当前作用域中的变量(也称为执行上下文).如果声明出现在函数中 - 声明了局部变量; 如果它在全局范围内 - 声明了一个全局变量.
x = 1
另一方面,仅仅是财产分配.它首先尝试解决x
范围链.如果它在该范围链中的任何位置找到它,它将执行赋值; 如果它没有找到x
,那么它x
才会在全局对象(它是作用域链中的顶级对象)上创建属性.
现在,请注意它没有声明全局变量,它会创建一个全局属性.
两者之间的区别是微妙的,可能会令人困惑,除非您了解变量声明也创建属性(仅在变量对象上),并且Javascript中的每个属性(即,ECMAScript)都有某些描述其属性的标志 - ReadOnly,DontEnum和DontDelete.
由于变量声明使用DontDelete标志创建属性,因此var x = 1
和x = 1
(在全局范围内执行时)之间的区别在于前者 - 变量声明 - 创建DontDelete'able属性,后者不创建.因此,可以从全局对象中删除通过此隐式赋值创建的属性,并且不能删除前一个 - 通过变量声明创建的属性.
但这当然只是理论,实际上由于实现中的各种错误(例如来自IE的错误),两者之间存在更多差异.
希望这一切都有道理:)
[更新2010/12/16]
在ES5(ECMAScript 5;最近标准化,第5版语言)中,有一种所谓的"严格模式" - 一种选择加入语言模式,它稍微改变了未声明的作业的行为.在严格模式下,对未声明标识符的赋值是ReferenceError.其基本原理是捕获意外分配,防止产生不希望的全局属性.一些较新的浏览器已经开始支持严格模式.例如,请参阅我的compat表.
如果你在全球范围内,则没有太大区别.阅读Kangax的答案进行解释
如果你在函数中,那么var
将创建一个局部变量,"no var"将查找作用域链,直到它找到变量或命中全局作用域(此时它将创建它):
// These are both globals var foo = 1; bar = 2; function() { var foo = 1; // Local bar = 2; // Global // Execute an anonymous function (function() { var wibble = 1; // Local foo = 2; // Inherits from scope above (creating a closure) moo = 3; // Global }()) }
如果你没有做任务,那么你需要使用var
:
var x; // Declare x
有区别.
var x = 1
声明 x
当前作用域中的变量(也称为执行上下文).如果声明出现在函数中 - 声明了局部变量; 如果它在全局范围内 - 声明了一个全局变量.
x = 1
另一方面,仅仅是财产分配.它首先尝试解决x
范围链.如果它在该范围链中的任何位置找到它,它将执行赋值; 如果它没有找到x
,那么它x
才会在全局对象(它是作用域链中的顶级对象)上创建属性.
现在,请注意它没有声明全局变量,它会创建一个全局属性.
两者之间的区别是微妙的,可能会令人困惑,除非您了解变量声明也创建属性(仅在变量对象上),并且Javascript中的每个属性(即,ECMAScript)都有某些描述其属性的标志 - ReadOnly,DontEnum和DontDelete.
由于变量声明使用DontDelete标志创建属性,因此var x = 1
和x = 1
(在全局范围内执行时)之间的区别在于前者 - 变量声明 - 创建DontDelete'able属性,后者不创建.因此,可以从全局对象中删除通过此隐式赋值创建的属性,并且不能删除前一个 - 通过变量声明创建的属性.
但这当然只是理论,实际上由于实现中的各种错误(例如来自IE的错误),两者之间存在更多差异.
希望这一切都有道理:)
[更新2010/12/16]
在ES5(ECMAScript 5;最近标准化,第5版语言)中,有一种所谓的"严格模式" - 一种选择加入语言模式,它稍微改变了未声明的作业的行为.在严格模式下,对未声明标识符的赋值是ReferenceError.其基本原理是捕获意外分配,防止产生不希望的全局属性.一些较新的浏览器已经开始支持严格模式.例如,请参阅我的compat表.
说它是" 本地和全球 " 之间的区别并不完全准确.
将它视为" 本地和最近 " 之间的区别可能更好.最近的肯定是全球性的,但情况并非总是如此.
/* global scope */ var local = true; var global = true; function outer() { /* local scope */ var local = true; var global = false; /* nearest scope = outer */ local = !global; function inner() { /* nearest scope = outer */ local = false; global = false; /* nearest scope = undefined */ /* defaults to defining a global */ public = global; } }
当Javascript在浏览器中执行时,所有代码都被with语句包围,如下所示:
with (window) { //Your code }
有关更多信息with
- MDN
由于在当前作用域中var
声明了一个变量,因此在声明内部窗口和根本不声明它之间没有区别.var
当你不直接进入窗口时,例如在函数内部或块内部,就会产生差异.
使用var
可以隐藏具有相同名称的外部变量.通过这种方式,您可以模拟"私有"变量,但这是另一个主题.
经验法则是始终使用var
,否则您将面临引入细微错误的风险.
编辑:在收到批评后,我想强调以下内容:
var
声明当前范围中的变量
全球范围是 window
不在全局范围(窗口)中使用var
隐式声明var
在全局范围(窗口)中使用声明变量var
与省略它相同.
声明在使用窗口不同的范围的变量var
是不一样的东西作为声明的变量,而不var
始终var
明确声明,因为这是一个好习惯
您应该始终使用var
关键字来声明变量.为什么?良好的编码实践本身就足够了,但是在没有var
关键字的情况下声明变量意味着它在全局范围内声明(像这样的变量称为"隐含"全局).Douglas Crockford 建议不要使用隐含的全局变量,并根据Apple JavaScript编码指南:
在没有
var
关键字的情况下创建的任何变量都是在全局范围内创建的,并且在函数返回时不会被垃圾收集(因为它不会超出范围),从而导致内存泄漏的机会.
因此,简而言之,始终使用var
关键字声明变量.
这里有一个很好的例子,说明如何通过以下方式来解决局部变量var
:
(i
在循环的每次迭代中重置,因为它不是在for
循环中本地声明但是全局声明)最终导致无限循环
我想说var
在大多数情况下使用它会更好.
局部变量总是比全局范围内的变量快.
如果不使用var
声明变量,则变量将在全局范围内.
有关详细信息,您可以在Google中搜索"范围链JavaScript".
var
!
var
是ES6之前声明变量的方法.我们现在在将来,你应该这样编码.
const
和let
const
应该用于95%的病例.它使得变量引用无法更改,因此数组,对象和DOM节点属性可以更改并且应该可能更改const
.
let
应该用于任何期望被重新分配的变量.这包括在for循环中.如果您varName =
在初始化之后编写,请使用let
.
两者都具有块级别范围,正如大多数其他语言所预期的那样.
没有var
- 全局变量.
强烈建议总是使用var
语句,因为在本地环境中的init全局变量 - 是邪恶的.但是,如果你需要这个肮脏的技巧,你应该在页面的开头写评论:
/* global: varname1, varname2... */
另一个区别,例如
var a = a || [] ; // works
而
a = a || [] ; // a is undefined error.
使用var
始终是一个好主意,以防止变量混乱全局范围和变量相互冲突,从而导致不必要的覆盖.