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

时间:2011-06-14 19:51:27

标签: javascript attributes scope

我正在阅读backbone.js文档并看到很多代码将属性分配给window对象:

window.something = "whatever";

调用此代码与分配变量和创建全局变量之间的区别是什么,如下所示:

something = "whatever";

我假设存在某种范围不同,和/或对象所有权差异(窗口是所有者与否)但我对两者之间的细节感兴趣以及为什么我会使用窗口而不使用它。

6 个答案:

答案 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)

未解析的引用(也称为未声明的变量)实际上不是变量,它们作为属性添加到全局对象。 [5c]

在严格模式下(“使用严格”),未解析的引用将引发ReferenceError。这是为了避免将要声明为变量的属性添加到全局对象。在这种情况下,如果您确实想向全局对象添加属性,则可以使用window.foo =“ bar”。 [5a]