使用'var'来声明变量是可选的吗?

“var”是可选的吗?

myObj = 1; 

与…一样 ?

 var myObj = 1; 

我发现他们都从我的测试工作,我认为var是可选的。 是对的吗?

他们是不同的意思。 如果使用var则变量在您所在的范围内声明(例如函数)。 如果你不使用var ,变量就会遍历整个范围层,直到遇到一个由给定名称或全局对象(如果你正在浏览器中执行它的窗口)的一个变量,然后它被附着在那里。 这全局变量非常相似 。 但是,它仍然可以delete (最有可能由别人的代码谁也没有使用vardelete 。 如果在全局范围中使用var ,则该变量是真正的全局变量,不能被删除。

在我看来,这是javascript最危险的问题之一,应该被弃用,或者至少提出警告警告。 原因是,很容易忘记var ,并无意中将一个公共变量名绑定到全局对象。 这产生了奇怪和难以调试的行为。

这是Javascript中棘手的部分之一,也是其核心特征之一。 用var声明的变量“开始其生命”就在你声明的地方。 如果你忽略了var ,那就好像你正在谈论一个你之前使用过的变量。

 var foo = 'first time use'; foo = 'second time use'; 

就范围而言,变量自动变为全局是正确的。 相反,Javascript将遍历范围链,看看你之前是否使用过这个变量。 如果它找到一个以前使用过的相同名字的变量的实例,它将使用该变量以及它所声明的任何范围。如果它没有在任何地方遇到变量,它最终将会触发全局对象(在浏览器中的window )并将附加到它的变量。

 var foo = "I'm global"; var bar = "So am I"; function () { var foo = "I'm local, the previous 'foo' didn't notice a thing"; var baz = "I'm local, too"; function () { var foo = "I'm even more local, all three 'foos' have different values"; baz = "I just changed 'baz' one scope higher, but it's still not global"; bar = "I just changed the global 'bar' variable"; xyz = "I just created a new global variable"; } } 

与嵌套函数和回调一起使用时,此行为非常强大。 了解什么是functions ,范围如何工作是Javascript中最重要的事情。

不,他们是不相同的。

myObj = 1; 你正在使用一个全局变量。

后面的声明为你正在使用的范围创建一个局部变量。

尝试下面的代码来理解差异:

 external = 5; function firsttry() { var external = 6; alert("first Try: " + external); } function secondtry() { external = 7; alert("second Try: " + external); } alert(external); // Prints 5 firsttry(); // Prints 6 alert(external); // Prints 5 secondtry(); // Prints 7 alert(external); // Prints 7 

第二个函数改变全局变量“external”的值,但是第一个函数没有。

除了本地和全球之外,还有更多。 使用var创建的全局变量与创建的全局变量不同。 考虑这个:

 var foo = 1; // declared properly bar = 2; // implied global window.baz = 3; // global via window object 

根据迄今为止的答案,这些全局变量, foobarbaz都是等价的。 事实并非如此。 用var全局变量被正确地赋值给内部的[[DontDelete]]属性,使得它们不能被删除。

 delete foo; // false delete bar; // true delete baz; // true foo; // 1 bar; // ReferenceError baz; // ReferenceError 

这就是为什么你应该总是使用var ,即使是全局变量。

var是可选的。 var在本地范围内放置一个变量。 如果一个变量被定义为没有var ,它是在全局范围内, 而不是可删除的

编辑

我认为这个不可删除的部分在某个特定环境的某个时间点是正确的。 我一定是梦见了。

围绕这个问题有这么多的困惑,现有的答案都没有涵盖所有的东西。 以下是一些内嵌评论的例子。

 //this is a declaration var foo; //this is an assignment bar = 3; //this is a declaration and an assignment var dual = 5; 

一个声明设置了一个DontDelete标志。 分配不。

声明将该变量与当前范围关联。

分配但未声明的变量将查找要附加到的范围。 这意味着它将遍历范围的食物链,直到找到具有相同名称的变量。 如果没有找到,它将被附加到顶层作用域(通常被称为全局作用域)。

 function example(){ //is a member of the scope defined by the function example var foo; //this function is also part of the scope of the function example var bar = function(){ foo = 12; // traverses scope and assigns example.foo to 12 } } function something_different(){ foo = 15; // traverses scope and assigns global.foo to 15 } 

为了对发生的事情有一个非常清晰的描述,这个删除函数的分析涵盖了广泛的变量实例化和分配。

他们不一样。

未声明的变量(无var )被视为全局对象的属性。 (通常window对象,除非你在一个块)

var声明的变量是普通的局部变量,在它们声明的函数外部是不可见的(注意,Javascript没有块范围)

JavaScript中的var关键字是有用的。

如果你声明一个没有var关键字的变量,像这样:

 myVar = 100; 

它成为一个全局变量,可以从脚本的任何部分访问。 如果你不是故意的,或者没有意识到的话,如果你在JavaScript的另一个地方重新使用变量名,会导致你的痛苦。

如果使用var关键字声明变量,如下所示:

 var myVar = 100; 

这是范围({ – 大括号,功能,文件,取决于你的位置)的本地。

这是一个更安全的方式来处理变量。 所以,除非你故意这样做,否则尝试用var关键字声明变量,而不是没有。

看看这个小提琴: http : //jsfiddle.net/GWr6Z/2/

 function doMe(){ a = "123"; // will be global var b = "321"; // local to doMe alert("a:"+a+" -- b:"+b); b = "something else"; // still local (not global) alert("a:"+a+" -- b:"+b); }; doMe() alert("a:"+a+" -- b:"+b); // `b` will not be defined, check console.log 

考虑今天在StackOverflow上提出的这个问题:

简单的Javascript问题

一个好的测试和一个实际的例子是在上述情况下发生的事情…
开发人员在他的一个变量中使用了JavaScript函数的名称。

代码有什么问题?
该代码仅在用户第一次单击该按钮时起作用。

有什么解决方案?
在变量名称之前添加var关键字。

Var不允许你程序员声明一个变量,因为Javascript没有变量。 Javascript有对象。 Var明确地声明一个未定义对象的名字。 赋值将一个名称指定给一个已赋值的对象的句柄。

使用var告诉Javacript解释器两件事:

  1. 不要使用 委托反向遍历查找值的名称,而是使用这一个
  2. 不要删除这个名字

省略var告诉Javacript解释器使用具有相同名称的对象的先前找到的先前实例。

Var作为一个关键词来源于语言设计师的一个糟糕的决定,就像Javascript作为一个名字来源于一个糟糕的决定一样。

PS。 研究上面的代码示例。

除了范围的一切,他们可以用不同的方式。

 console.out(var myObj=1); //SyntaxError: Unexpected token var console.out(myObj=1); //1 

东西声明与表达式

不,这不是“必需的”,但也可能是因为如果不这样做,可能会导致严重的问题。 没有用var定义一个变量,把这个变量放在它所在的代码部分的范围内。如果你不这样做,那么它不包含在那个范围内,并且可以覆盖以前定义的变量你所在的功能。

我刚从同事介绍的一个论坛上找到答案。 如果你在一个函数之外声明一个变量,它总是全局的。 不管你是否使用var关键字。 但是,如果你在一个函数里面声明了这个变量,那么它有很大的区别。 在函数内部,如果使用var关键字声明变量,它将是本地的,但是如果声明不带var关键字的变量,它将是全局的。 它可以覆盖你以前声明的变量。 请参阅: http : //forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash。 xNnLrwc3.dpuf