Search code examples
javascriptiife

Once an IIFE expression is stored in a variable, why can’t the function be invoked again?


I have:

var Init = (function() {
   my js goes here
})();

And my JS executes correctly when the page is loaded. I also have:

$('form :checkbox').change(function() {
   Init();
});

But Firebug says Init is not a function.


Solution

  • It isn't a function.

    (function() {
       ...
    })()
    

    evaluates the anonymous function right then. And the result of the evaluation apparently does not return a function-object in this case :-)

    Consider:

    f = (function() {
       return "not a function :("
    })()
    alert(f())
    

    and

    f = (function() {
       return function () { return "Yay!" }
    })()
    alert(f())
    

    Happy coding :)


    Here is a function which will "execute something once" and then "return that something to execute later". (See "You can either [assign] a function or call it; you can't do both..." from Slaks answer.) However, I wouldn't do it like this.

    Init = (function () {
      function Init () {
        alert("whee!")
      }
      Init()
      return Init
    })()
    Init()
    

    Here is another solution (much shorter/cleaner) from CD Sanchez (see comment) which takes advantage of the fact that an assignment evaluates to the assigned value:

    var Init; (Init = function Init () {
      alert ("wee");
    })()