Search code examples
javascriptiife

Why does an IIFE that appears after an object literal expression throw an error?


I'm defining various modules in a JavaScript file:

var module = {/* ... */}

(function(){
    console.log('Invoked');
})()

However the IIFE throws an error:

TypeError: object is not a function

I tried copy and pasting just the IIFE code and there is no issue.


Solution

  • The module definition needs a semicolon at the end of the declaration:

    var module = {/* ... */}; // <======= Semicolon!
    
    (function(){
        console.log('Invoked');
    })()
    

    Without it Javascript is trying to call the object:

    var module = {/* ... */}(function(){console.log('Invoked');})()
    

    Or shortened:

    var module = {/* ... */}()
    

    You'd get the same problem when trying to writing two IIFEs next to each other:

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

    This doesn't work because a single function declaration returns undefined:

    TypeError: undefined is not a function