javascript中的全局var和window.variable有什么区别?

Der*_*ley 72 javascript attributes scope

我正在阅读backbone.js文档,并看到很多代码将属性分配给window对象:

window.something = "whatever";
Run Code Online (Sandbox Code Playgroud)

调用此代码与分配变量和创建全局变量之间的区别是什么,如下所示:

something = "whatever";
Run Code Online (Sandbox Code Playgroud)

我假设有某种范围不同,和/或对象所有权差异(窗口是所有者与否)但我对两者之间的细节感兴趣,为什么我会使用窗口vs不使用它.

Ray*_*nos 68

没有不同.它们都具有相同的效果(在浏览器中,window全局上下文1在哪里).

  • window.foo = "bar"设置该属性foowindow.
  • foo = "bar"表示拼写错误或故意全局.

由于我必须仔细检查它是否是拼写错误,我个人觉得直接设置它更具可读性window.foo.

此外,在ES5严格模式下,foo = "bar"是非法赋值,因为foo未声明并将抛出Error.

编辑:

如评论中所述,foo = "bar"将在变量的范围链中一直向上看foo,"bar"如果找到它则重新分配它.如果找不到,它将创建一个新的全局变量.

此外,window.foo = "bar"您只需将属性分配给对象,即可使用删除对象delete window.foo.

在ES5严格模式下是无效的,以delete一个变量.


1在其他环境中,例如node.js和Web Workers,可能还有另一个全局对象的名称,window可能根本不存在.Node.js使用global和Web Workers使用self.

  • 它们是有区别的.`window.foo = bar;`在窗口对象上设置foo.`foo = bar;`搜索范围链,直到找到`foo`,这可能最终成为全局对象,但并非总是如此. (8认同)
  • 顺便说一下,你可以删除window.foo但不能删除用var定义的全局foo. (4认同)

gio*_*_13 8

他们都做同样的事情.
但是通过访问一个window属性,无论你在什么范围内,你都可以确定你正在访问一个全局变量.
例如:

globalVar = "smth";
function(){
    var globalVar = 2;
    alert(globalVar);// points to the current scope globalVar
    alert(window.globalVar);// points to the original globalVar
}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果你想使用全局变量,通过它们的容器访问它们会更安全一些: window.variable


Sco*_*oon 5

正如Raynos所提到的那样,关键是它明确地设置在窗口对象上.在浏览器中,全局对象与窗口对象相同,但在其他环境中(例如node.js,或者可能在移动设备上的某种Web视图中运行),它可能不是.