在声明JavaScript变量时,是否必须使用var关键字?

68

可能是重复问题:
Javascript: is using 'var' to declare variables optional?

在JavaScript中创建变量时,是否必须在变量名前添加“var”?

例如,可以使用:

var message = "Hello World!"

我能使用

message = "Hello World!"

我注意到像Google Adsense这样的脚本不使用var关键字。

例如:

google_ad_width = 160;
google_ad_height = 600;
google_color_border = "000000";
google_color_bg = "ffffff";

6
我进行了一次基于你问题标题的 SO 搜索。这是我收到的第一个结果:https://dev59.com/vXE95IYBdhLWcg3wDpYG。 - user113716
6个回答

115
如果你没有使用varletconst明确地创建一个变量(在当前作用域中),那么(在非严格模式下)你将创建一个隐式的全局变量。
全局变量是让不同函数互相覆盖彼此的变量的好方法(即它们使得代码难以维护)。
如果你使用var,那么该变量的作用域仅限于当前函数(以及它内部的任何内容——可能会嵌套函数)。
constlet将常量和变量的作用域限制在当前块而不是函数中,这通常比var更容易管理变量。)
Google Adsense使用全局变量,因为它将脚本分成两个不同的部分(一个本地的和一个远程的)。更清晰的方法是调用在远程脚本中定义的函数并将参数作为参数传递,而不是从全局作用域中获取它们。
现代JS应该在严格模式下编写,这禁止使用隐式全局变量(更倾向于在顶层显式声明它们,从而防止变量名的拼写错误造成意外全局变量)。

11

是的,你应该总是使用var

不使用var有两个主要缺点:

  • 在函数内部访问未在该函数内定义的变量将导致解析器在作用域链中查找具有该名称的变量,直到它找到一个或者到达全局对象(通过window在浏览器中可访问),在那里它将创建一个属性。这个全局属性现在可以在任何地方使用,可能会导致混淆和难以检测的错误;
  • 在ECMAScript 5严格模式下,访问未声明的变量将导致错误。

另外,对于全局变量,不使用var并不完全等同于使用var:当使用var时,它在全局对象上创建的属性具有内部的DontDelete属性,而没有使用var则不是这种情况:

// Next line works in any ECMAScript environment. In browsers, you can
// just use the window object.
var globalObj = (function() { return this; })();

var x = 1;
delete globalObj.x;
alert(x); // Alerts 1, x could not be deleted

y = 2;
delete globalObj.y;
alert(y); // Error, y is undefined

4

来自http://www.updrift.com/article/to-var-or-not-to-var-my-javascript

  1. 对于全局变量,使用与否并不重要,但为了保持一致性,您可能需要使用它。
  2. 在本地函数中始终尝试使用“var”声明变量。这确保您在使用变量的本地副本,而不是在不同作用域中具有相同名称的另一个变量。

例如,在此处具有相似功能的两个函数具有非常不同的效果:

var myvar = 0;
function affectsGlobalVar(i){
   myvar = i;
}
function doesNotAffectGlobalVar(i){
   var myvar = i;
}

3

如果不使用var关键字声明变量,则该变量将被定义为全局变量。


1

1
对于像我这样的“无知者”,JavaScript 基本上有两个变量作用域:全局和局部。在函数外分配的变量是全局的,而在函数内使用 var 关键字分配的变量是局部的(这并不是什么高深莫测的东西)。但是,如果你省略了 var 关键字,它会分配一个全局变量,而不管它在哪里声明。
来源:http://opensoul.org/2008/9/4/the-importance-of-var-in-javascript

基本上来说,那是正确的。然而,可能存在嵌套的本地作用域。在另一个函数内声明的变量无法被父函数访问。 - treeface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接