var是可选的吗?

myObj = 1;

和?

var myObj = 1;

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


当前回答

这是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中最重要的事情。

其他回答

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

edit

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

撇开范围不谈,它们可以用不同的方式使用。

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

语句和表达式

这是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中最重要的事情。

它们不一样。

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

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

更新:ECMAScript 2015

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

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

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

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

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

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

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