我正在阅读ribs.js文档,并看到了许多将属性分配给window对象的代码:
window.something = "whatever";
调用此代码与仅分配变量并创建全局变量之间有什么区别,如下所示:
something = "whatever";
我假设存在某种范围上的差异,和/或对象所有权上的差异(窗口是所有者而不是所有者),但是我对两者之间的详细信息以及为什么我要使用窗口而不是窗口不感兴趣。
Answers:
没有不同。它们都具有相同的效果(在浏览器中,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
。
window.foo = bar;
在窗口对象上设置foo。foo = bar;
搜索作用域链,直到找到为止foo
,这可能最终成为全局对象,但并非总是如此。
window
是全局对象,@ kennebec描述的行为是正确的。但是,旧版本的IE不符合要求。
再加一点:
如果你是指一个未声明的变量直接(不使用-窗口或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
}