在 JavaScript 中,全局变量和“ window.variable”有什么区别?

我正在阅读 Backbone js文档,看到了很多为 窗户对象分配属性的代码:

window.something = "whatever";

调用这段代码与仅仅赋值变量和创建一个全局变量有什么不同,如下所示:

something = "whatever";

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

38074 次浏览

No difference. They both have the same effect (In the browser, where window is the global context1).

  • window.foo = "bar" sets the property foo on window.
  • foo = "bar" indicates either a typo or intentionally global.

Since I have to double check whether it's a typo or not, I personally find it more readable to set window.foo directly.

Also, in ES5 strict mode, foo = "bar" is an illegal assignment because foo is not declared and will throw a Error.

Edit:

As noted in the comments, foo = "bar" will look all the way up the scope chain for the variable foo and re-assign it with "bar" if it's found. If it's not found, it will create a new global variable.

Also with window.foo = "bar" you're just assigning a property to an object, which can be deleted using delete window.foo.

In ES5 strict mode it is invalid to delete a variable.


1 In other environments, such as node.js and Web Workers, there may be another name for the global object and window may not exist at all. Node.js uses global and Web Workers use self.

The difference is that window.foo = bar; cannot be intercepted by refactoring done later. Using foo = bar; means that if, at a later date, the code is moved into a closure where var foo has been defined, it will no longer set it on the global object.

The key, as Raynos alluded to, is that it's set explicitly on the window object. In the browser, the global object is the same as the window object but in other environments (e.g., Node.js, or perhaps running in a web view of some sort on a mobile device), it may not.

They both kind of do the same thing. But by accessing a window property, you know for sure that you're accessing a global variable no matter what scope you're in.

For example:

globalVar = "smth";
function(){
var globalVar = 2;
alert(globalVar); // Points to the current scope globalVar
alert(window.globalVar); // Points to the original globalVar
}

In other words, If you want to work with globals, it's somewhat safer to access them via their container: window.variable

Adding one more point:

If you refer an undeclared variable directly (without using - window or typeof) then you will get a variable is not defined error.

Examples:

// 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
}