javascript - var关键字和何时使用它( 或者省略它)?

  显示原文与译文双语对照的内容

注意 : 这个问题是从ECMAScript版本 3或者 5的角度提出的。 在 ECMAScript 6的发行版中引入新特性时,答案可能会过时。

var 关键字在Javascript中的具体功能是什么,它之间的区别是:


var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

还有:


someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

什么时候使用哪一个,以及为什么?

时间:

如果你在全局作用域中,则没有差异。

如果你在函数中,"var"将创建一个局部变量,"无 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 上面 (creating a closure)
 moo = 3;//Global
 }())
}

如果你没有执行赋值,那么你需要使用 var:


var x;//Declare x

说这是"本地和全局 "的区别不是完全准确的。

最好把它看作是"最近本地和"之间的差异。 最近的可以是全局的,但并不总是这样。


/* 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 (window) {
//Your code
}

关于 with - MDN的更多信息

在all,因为 var 声明一个变量在当前作用域,没有区别声明 var里面窗口然后不声明上面,

区别则在于不直接放到窗口,比如 出现在函数中也可以用在块。

使用 var 可以隐藏具有相同名称的外部变量。 通过这种方式,你可以模拟一个"专用的"变量,但这是另一个主题。

经验法则是总是使用 var,否则你就会面临引入微妙的Bug的风险。

编辑:在收到评论之后,我想强调以下几点:

  • var 在当前范围内声明一个变量
  • 全局作用域是 window
  • 在全局作用域( 窗口) 中不使用 var 隐式声明 var
  • 使用 var 是一样的作为省略it,将变量声明在全局范围中
  • 将变量声明的作用域不同于窗口中使用 var并不是同样的事情作为在声明变量时不var
  • 总是显式声明 var,因为它是良好的实践

你应该总是 改用 var 关键字来声明变量。 为什么是有原因的最佳编码实践应该足够在本身,而是在 var 关键字声明变量时不意味着它被声明在全局 范围所暗示"全局) ( 这样一个变量叫做"中。? Douglas Crockford 建议从不使用隐含的全局变量,并根据 Apple JavaScript编码指南:

没有 var 关键字创建的任何变量都是在全局作用域创建的,并且在 function returns (because it doesn't go out of scope) 中不是垃圾收集时,它表示内存泄漏的机会。

因此,简而言之,总是使用 var 关键字声明变量。

下面是一个很好的例子,你可以使用 var 来避免声明局部变量:


<script>
one();

function one()
{
 for (i = 0;i <10;i++)
 {
 two(i);
 alert(i);
 }
}

function two()
{
 i = 1;
}
</script>

( i 在循环的每次迭代时被重置,因为它不是在 for 循环中局部声明,而是全局地声明)

...