Royi Namir
Royi Namir

Reputation: 148524

IIFE and window object?

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

Answers (1)

mpm
mpm

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

Related Questions