var是可选的吗?

myObj = 1;

和?

var myObj = 1;

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


当前回答

看看这个Fiddle: 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

其他回答

Javascript中的var关键字是有目的的。

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

myVar = 100;

它变成了一个全局变量,可以从脚本的任何部分访问。如果你不是故意这样做的,或者没有意识到这一点,如果你在javascript的另一个地方重复使用变量名,它会给你带来痛苦。

如果你用var关键字来声明变量,就像这样:

var myVar = 100;

它是作用域的局部({]-括号,函数,文件,取决于你把它放在哪里)。

这是一种更安全的处理变量的方法。因此,除非你是故意这样做,尽量声明变量与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
}

为了非常清楚地描述发生了什么,本文对delete函数的分析广泛地涵盖了变量实例化和赋值。

想想今天在StackOverflow上被问到的这个问题:

简单的Javascript问题

上面的场景是一个很好的测试和一个实际的例子…… 开发人员在他的一个变量中使用了JavaScript函数的名称。

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

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

这不仅仅是局部和全局的区别。使用var创建的全局变量与不使用var创建的全局变量不同。考虑一下:

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

根据到目前为止的答案,这些全局变量foo、bar和baz都是等价的。事实并非如此。使用var创建的全局变量被(正确地)分配了内部[[DontDelete]]属性,这样它们就不能被删除。

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

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

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

Var不允许程序员声明变量,因为Javascript没有变量。Javascript有对象。Var显式地向未定义的对象声明一个名称。赋值将一个名称作为句柄分配给已赋值的对象。

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

不使用委托反向遍历查找值的名称,而是使用此名称 不删除名字

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

Var作为关键字源于语言设计者的错误决定,就像Javascript作为名称源于错误决定一样。

ps.学习上面的代码示例。