11

可能重复:
JavaScript 变量范围

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

但是 oustide of functions 呢, var 有什么作用呢?

4

6 回答 6

10

首先,在函数之外使用代码通常是不好的做法。如果不出意外,请将您的代码包装在匿名函数中:

(function(){
    // code
})();

至于 var 有什么作用,它“声明”了一个变量:

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

与:

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

原因是上面的代码在功能上等同于:

alert(window.foo);

如果不使用 声明变量var,则会出现查找错误,这与尝试访问任何不存在的对象的属性相同。

请注意,其中一个奇怪的var地方是所有声明都被拉到脚本的顶部,所以这也可以:

alert(foo); // undefined
var foo;

您还可以访问window对象中的变量(尽管您也可以通过设置不带 var 的变量来获得此权限,例如 just foo=42):

var foo;
for(var key in window){
   // one of these keys will be 'foo'
}
于 2011-06-09T22:33:53.753 回答
6

始终使用var. _ 严格来说,当您已经在全局范围内时,您不需要这样做,但为了代码的可维护性,您应该这样做。

假设你有:

foo = 'bar';

但后来你决定要将此代码移动到一个函数中:

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

如果您忘记添加一个var语句,您刚刚创建了一个隐式全局。现在,如果您在名为的全局范围内创建一个新对象,foo它们将导致相互冲突。

function doSomething() {
    foo = 'bar'; // Implicit global
}

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

当您忘记在循环中使用var类似的东西时,这种错误尤其隐蔽。学习使用JSLint有助于避免这些和其他有问题的逻辑或语法错误。ifor

于 2011-06-09T23:03:29.243 回答
1

您的问题已在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var中得到解答

在函数外使用 var 是可选的;为未声明的变量赋值会隐式地将其声明为全局变量。但是,建议始终使用 var,并且在以下情况下必须在函数内使用:

  • 如果包含函数的范围(包括全局范围)中的变量具有相同的名称。
  • 如果递归或多个函数使用具有相同名称的变量并且 > 打算将这些变量设为本地。

在这些情况下未能声明变量很可能会导致意外结果。

于 2011-06-09T22:48:03.817 回答
0

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

于 2011-06-09T22:39:33.430 回答
0

我相信在函数之外使用 var 与不使用 var 一样:你得到一个全局变量。例外情况是,如果您在一个类或其他命名空间结构中,它仍将在该语言环境中定义一个变量

于 2011-06-09T22:32:40.477 回答
0

我相信您想在初始化变量时创建一个 var。正如我编码的那样,当我需要初始化一个变量时,我用 var 开始它。如果你声明一个不带 var 的变量,它总是全局的。如果你在函数内部用 var 声明一个变量,它是该函数的本地变量。如果您在函数外部使用 var 创建一个变量,它将是一个全局变量。

于 2011-06-09T22:32:58.177 回答