I’m reading the Backbone.js documents and am seeing a lot of code that assigns attributes to the window object:
window.something = "whatever";
What’s the difference between calling this code, and just assigning the variable and creating a global variable, like this:
something = "whatever";
I assume there is some kind of scope difference, and/or object ownership difference (window being the owner vs. not), but I am interested in the detail between the two and why I would use window vs. not use it.
No difference. They both have the same effect (In the browser, where
windowis the global context1).window.foo = "bar"sets the propertyfooonwindow.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.foodirectly.Also, in ES5 strict mode,
foo = "bar"is an illegal assignment becausefoois not declared and will throw aError.Edit:
As noted in the comments,
foo = "bar"will look all the way up the scope chain for the variablefooand 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 usingdelete window.foo.In ES5 strict mode it is invalid to
deletea variable.1 In other environments, such as node.js and Web Workers, there may be another name for the global object and
windowmay not exist at all. Node.js usesglobaland Web Workers useself.