我正在阅读backbone.js文档并看到很多代码将属性分配给window对象:
window.something = "whatever";
调用此代码与分配变量和创建全局变量之间的区别是什么,如下所示:
something = "whatever";
我假设存在某种范围不同,和/或对象所有权差异(窗口是所有者与否)但我对两者之间的细节感兴趣以及为什么我会使用窗口而不使用它。
答案 0 :(得分:68)
没有区别。它们都具有相同的效果(在浏览器中,window
是全局上下文 1 )。
window.foo = "bar"
在foo
上设置了属性window
。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
。
答案 1 :(得分:8)
他们都做同样的事情
但是通过访问window
属性,无论您处于什么范围,您都可以确定您正在访问全局变量。
例如:
globalVar = "smth";
function(){
var globalVar = 2;
alert(globalVar);// points to the current scope globalVar
alert(window.globalVar);// points to the original globalVar
}
换句话说,如果你想使用全局变量,通过它们的容器访问它们会更安全一些:window.variable
答案 2 :(得分:5)
正如Raynos所提到的,关键是它是在窗口对象上明确设置的。在浏览器中,全局对象与窗口对象相同,但在其他环境中(例如node.js,或者可能在移动设备上的某种Web视图中运行),它可能不会。
答案 3 :(得分:2)
不同之处在于window.foo = bar;
无法通过稍后完成的重构来截获。
使用foo = bar;
意味着,如果稍后将代码移动到已定义var foo
的闭包中,则不再将其设置在全局对象上。
答案 4 :(得分:0)
再增加一点:
如果您直接引用未声明的变量(不使用 - 窗口或 typeof ),那么您将获得未定义的变量错误
示例:
// var unDecVariable
if (unDecVariable != null) // Error: unDecVariable is not defined
{
// do something
}
if (window.unDecVariable != null) // No Error
{
// do something
}
if (typeof unDecVariable != 'undefined' && unDecVariable != null) // Alternative way
{
// do something
}
答案 5 :(得分:0)