全局variables和JavaScript中的window.variable有什么区别?

我正在阅读backbone.js文档,并看到许多将属性赋值给窗口对象的代码:

window.something = "whatever"; 

调用这段代码和分配variables并创build一个全局variables之间有什么区别,如下所示:

 something = "whatever"; 

我认为有一些不同的范围,和/或对象所有权的差异(窗口是所有者VS不),但我对两者之间的细节感兴趣,为什么我会使用窗口VS不使用它。

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

  • window.foo = "bar"window上设置属性foo
  • foo = "bar"表示打字错误或故意全局。

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

另外,在ES5严格模式下, foo = "bar"是非法的赋值,因为foo没有被声明,并且会抛出一个Error

编辑:

正如在注释中指出的那样, foo = "bar"将会查找variablesfoo的作用域链,如果find,则将它重新赋值为"bar" 。 如果没有find,它会创build一个新的全局variables。

另外window.foo = "bar"你只是将一个属性赋值给一个对象,这个对象可以使用delete window.foodelete window.foo

在ES5严格模式下, delete一个variables是无效的。


1在其他环境(如node.js和Web Workers)中,全局对象可能有其他名称,并且window可能根本不存在。 Node.js使用global和Web Workers使用self

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

他们俩都做同样的事情。
但是通过访问一个window属性,无论你在什么范围内,你都知道你正在访问一个全局variables。
例如 :

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

换句话说,如果你想使用全局variables,通过它们的容器访问它们比较安全: window.variable

不同的是, window.foo = bar; 不能被稍后的重构拦截。 使用foo = bar; 意味着如果在以后的日子,代码被移入一个已经定义了var foo的闭包,它将不再将其设置在全局对象上。