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"设置该属性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属性,无论你在什么范围内,你都可以确定你正在访问一个全局变量.
例如:
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
正如Raynos所提到的那样,关键是它明确地设置在窗口对象上.在浏览器中,全局对象与窗口对象相同,但在其他环境中(例如node.js,或者可能在移动设备上的某种Web视图中运行),它可能不是.