var是可选的吗?

myObj = 1;

和?

var myObj = 1;

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


当前回答

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函数的分析广泛地涵盖了变量实例化和赋值。

不,这不是“必需的”,但如果你不这样做,可能会导致重大问题。不使用var定义变量,将该变量置于其所在代码部分的作用域内。如果不这样做,那么它就不包含在该作用域中,并且可以覆盖先前定义的在函数作用域之外的同名变量。

不,它们不相等。

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)被视为全局对象的属性。(通常是窗口对象,除非你在with块中)

用var声明的变量是正常的局部变量,在声明它们的函数之外是不可见的。(注意Javascript没有块作用域)

更新:ECMAScript 2015

let是在ECMAScript 2015中引入的,具有块作用域。

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

简单的Javascript问题

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

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

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