全局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.foo
来delete 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
的闭包,它将不再将其设置在全局对象上。