var是可选的吗?

myObj = 1;

和?

var myObj = 1;

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


当前回答

Var是可选的。Var将变量置于局部作用域。如果一个变量在定义时没有使用var,那么它是在全局作用域中,是不可删除的。

edit

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

其他回答

它们不一样。

未声明的变量(没有var)被视为全局对象的属性。(通常是窗口对象,除非你在with块中)

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

更新:ECMAScript 2015

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

这是Javascript最棘手的部分之一,但也是它的核心特性之一。用var声明的变量在你声明它的地方“开始它的生命”。如果你省略了var,这就像你在谈论一个你之前使用过的变量。

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

至于作用域,变量不可能自动变成全局变量。相反,Javascript将遍历作用域链,以查看之前是否使用过该变量。如果它发现了一个以前使用过的同名变量的实例,它将使用该变量以及声明它的作用域。如果它在任何地方都没有遇到变量,它将最终击中全局对象(浏览器中的窗口),并将变量附加到它。

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";
    }
}

当与嵌套函数和回调函数一起使用时,此行为非常强大。学习什么是函数以及作用域如何工作是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创建的全局变量不同。考虑一下:

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,即使是全局变量。

I just found the answer from a forum referred by one of my colleague. If you declare a variable outside a function, it's always global. No matter if you use var keyword or not. But, if you declare the variable inside a function, it has a big difference. Inside a function, if you declare the variable using var keyword, it will be local, but if you declare the variable without var keyword, it will be global. It can overwrite your previously declared variables. - See more at: http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/#sthash.xNnLrwc3.dpuf