Have you ever taken a look under the hood at the jQuery 1.4 source code and noticed how it's encapsulated in the following way:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
I've read an article on JavaScript Namespacing and another one called "An Important Pair of Parens," so I know some about what's going on here.
But I've never seen this particular syntax before. What is that undefined
doing there? And why does window
need to be passed and then appear at the end again?
The undefined is a normal variable and can be changed simply with undefined = "new value";
. So jQuery creates a local "undefined" variable that is REALLY undefined.
The window variable is made local for performance reasons. Because when JavaScript looks up a variable, it first goes through the local variables until it finds the variable name. When it's not found, JavaScript goes through the next scope etc. until it filters through the global variables. So if the window variable is made local, JavaScript can look it up quicker. Further information: Speed Up Your JavaScript - Nicholas C. Zakas
Undefined
By declaring undefined
as an argument but never passing a value to it ensures that it is always undefined, as it is simply a variable in the global scope that can be overwritten. This makes a === undefined
a safe alternative to typeof a == 'undefined'
, which saves a few characters. It also makes the code more minifier-friendly, as undefined
can be shortened to u
for example, saving a few more characters.
Window
Passing window
as an argument keeps a copy in the local scope, which affects performance: http://jsperf.com/short-scope. All accesses to window
will now have to travel one level less up the scope chain. As with undefined
, a local copy again allows for more aggressive minification.
Sidenote:
Though this may not have been the intention of the jQuery developers, passing in window
allows the library to be more easily integrated in server-side Javascript environments, for example node.js - where there is no global window
object. In such a situation, only one line needs to be changed to replace the window
object with another one. In the case of jQuery, a mock window
object can be created and passed in for the purpose of HTML scraping (a library such as jsdom can do this).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With