关于javascript:我什么时候使用var?

When do I use var?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
JavaScript Variable Scope

我的理解是,在一个函数中,如果我使用var,那么我有一个局部变量。如果我不delcare var,我现在有一个全局变量。

但是函数的oustide呢,var有什么影响呢?


首先,在函数之外使用代码通常是不好的做法。如果没有其他内容,请用匿名函数包装代码:

1
2
3
(function(){
    // code
})();

对于var的影响,它"声明"了一个变量:

1
2
var foo;
alert(foo); // undefined;

VS:

1
alert(foo); // error: foo is not defined

原因是上述代码在功能上与以下代码相同:

1
alert(window.foo);

在不使用var声明变量的情况下,您会得到一个查找错误,与尝试访问不存在的任何对象的属性相同。

注意,var的一个奇怪之处是,所有声明都被拉到脚本的顶部,因此这也会起作用:

1
2
alert(foo); // undefined
var foo;

您还可以访问window对象中的变量(尽管您也可以通过设置不带var的变量来访问,例如,只使用foo=42)。

1
2
3
4
var foo;
for(var key in window){
   // one of these keys will be 'foo'
}


始终使用var是一种良好的做法。严格地说,当您已经在全局范围内时,您不需要这样做,但是为了代码的可维护性,您应该这样做。

说你有:

1
foo = 'bar';

但稍后您决定要将此代码移动到函数中:

1
2
3
function doSomething() {
    foo = 'bar'; // oops forgot to add var
}

如果你忘记添加一个var语句,你就创建了一个隐式全局变量。现在,如果在全局范围内创建一个名为foo的新对象,它们将导致彼此冲突。

1
2
3
4
5
6
7
function doSomething() {
    foo = 'bar'; // Implicit global
}

foo = 'baz';
doSomething();
console.log(foo); // Returns 'bar', not 'baz'

当您忘记在for循环中对类似于i的东西使用var时,这种错误是特别阴险的。学习使用JSLint有助于避免这些以及其他有问题的逻辑或语法错误。


您的问题在https://developer.mozilla.org/en-us/docs/web/javascript/reference/statements/var中得到了解答。

Using var outside a function is
optional; assigning a value to an
undeclared variable implicitly
declares it as a global variable.
However, it is recommended to always
use var, and it is necessary within
functions in the following situations:

  • If a variable in a scope containing the function (including the global scope) has the same name.
  • If recursive or multiple functions use variables with the same name and> intend those variables to be local.

Failure to declare the variable in
these cases will very likely lead to
unexpected results.


如果您声明一个全局变量并设置一个值,它将没有任何实际值,但如前所述,这是最佳实践。但是,如果要声明一个没有值的变量,则需要"var"。


我相信您希望在初始化变量时创建一个var。正如我所编写的代码,当我需要初始化一个变量时,我从var开始。如果您声明一个没有var这个词的变量,它总是全局的。如果在函数内部声明一个带有var的变量,它就是该函数的局部变量。如果在函数外部创建一个变量,它将是一个全局变量。


我相信在函数外部使用var和不使用var是一样的:您得到一个全局变量。如果您在一个类或其他名称空间结构中,它仍将在该区域设置中定义一个变量,那么这将是一个例外。