Reputation: 148524
IIFE
which need to access non-overridden window
object - can be seen as:
something like (jQuery example):
$(function (global) {
// do something with global
})( window );
But sometimes I also see this (underscore.js):
(function() {
var global= this;
// do something with global
}).call(this);
Question 1: is there any difference? If so, when should I use each?
Question 2: this
inside IIFE
is window
. Why is it necessary to "send" window
/call(this)
? (jQuery isn't using strict mode imho)
NB
It looks like jQuery (since 1.11.0) has also adopted this pattern:
(function (global, factory)
{
//....
}(typeof window !== "undefined" ? window : this, function (window, noGlobal)
{
//...
});
Upvotes: 8
Views: 2906
Reputation: 20154
(function() {
var win = this;
// do something with win
}).call(this);
Underscore is a javascript library not a DOM library,therefore it should not use window anywhere,since javascript is not the DOM and window is a DOM api
Underscore isnt tied to the DOM with this approach. Trying to call window in nodejs or rhino is not going to work and doesnt make any sense.
EDIT :
call sets the context of the function to this(global or window) , so no need to pass anything as an argument.
Upvotes: 3