javascript中的全局变量和window.variable有什么区别?

| 我正在阅读ribs.js文档,并看到了许多将属性分配给window对象的代码:
window.something = \"whatever\";
调用此代码与仅分配变量并创建全局var之间有什么区别,如下所示:
something = \"whatever\";
我认为存在某种范围上的差异,和/或对象所有权上的差异(窗口是所有者而不是所有者),但我对两者之间的详细信息以及为什么我要使用窗口而不是不使用它感兴趣。     
已邀请:
        没有不同。两者具有相同的效果(在浏览器中,
window
是全局上下文1)。
window.foo = \"bar\"
window
上设置属性
foo
foo = \"bar\"
表示错别字或故意有误。 由于我必须仔细检查它是否是错字,因此我个人认为直接设置
window.foo
更具可读性。 另外,在ES5严格模式下,
foo = \"bar\"
是非法分配,因为未声明
foo
并将抛出
Error
。 编辑: 如注释中所述,
foo = \"bar\"
将一直在变量
foo
的范围链中向上查找,如果找到,将其重新分配给with13ѭ。如果找不到,它将创建一个新的全局变量。 同样使用
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
}
换句话说,如果您想使用全局变量,通过它们的容器访问它们会更加安全:
window.variable
    
        正如雷诺斯(Raynos)所暗示的那样,关键是它是在窗口对象上显式设置的。在浏览器中,全局对象与窗口对象相同,但是在其他环境中(例如,node.js,或者可能在移动设备上的某种Web视图中运行),则可能不是。     
        所不同的是,
window.foo = bar;
无法通过稍后进行的重构来拦截。 使用
foo = bar;
意味着如果以后将代码移到已定义
var foo
的闭包中,它将不再在全局对象上进行设置。     
        再加一点: 如果直接引用未声明的变量(不使用-window或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
}
    
        未解析的引用(也称为未声明的变量)实际上不是变量,它们作为属性添加到全局对象。 [5c] 在严格模式下(\“使用严格\”),未解析的引用将引发ReferenceError。这是为了避免将要声明为变量的属性添加到全局对象。在这种情况下,如果您确实想向全局对象添加属性,则可以使用window.foo = \“ bar \”。 [5a]     

要回复问题请先登录注册