Functions are a core component of Javascript language. We do a lot of function declaration in our daily programming life. After reading this article, you might use a power of IIFE to encapsulate your business logic and expose minimum methods to a global scope. IIFE is acronym for “Immediately Invoked Function Expression”. It is pronounced as “iify”. The Very simple syntax of IIFE is as below.

JavaScript
(function() {
    /* Code here */
})();

Content

  • Function Declaration vs Function Expression
  • Immediately Invoked Function Expression – IIFE
  • Usage : Encapsulation in JS using IIFE

Function Declaration vs Function Expression

In javascript, function keyword can be used as a function declaration or as a function expression.

Function Declaration

Function declaration defines the function. Function declaration start with function keyword in the global scope or inside a function.

JavaScript
// ==== NAMED FUNCTION DECLARATION ====
function square(a) {
    var result = a * a;
    console.log("Result: "+ result);
    return result;
}
// You can call named function by its name.
square(2);
//Output: Result: 4

Function Expression

Function expression can be defined using a function keyword. Function expression must not start with function keyword. Function expression can be created by wrapping function declaration inside parenthesis (). Function Expression can also start with Unary Operator (~, +, -, &) .

JavaScript
// ==== ANONYMOUS FUNCTION EXPRESSION ====
var printMessage = function() {
    console.log("Anonymous Function Expression can be called by function identifier.");
}
printMessage();
// Output: Anonymous Function Expression can be called by function's identifier.


// ==== NAMED FUNCTION EXPRESSION ====
var getSquare = function square(a) {
    var result = a * a;
    console.log("Result: "+ result);
    return result;
}
// You can call named function by its name.
getSquare(2);
// Result: 4

square(2);
// prints syntax error : square is not defined.

// ==== WRAP PARENTHESIS TO CREATE FUNCTION EXPRESSION ====
(function square(a) {
    var result = a * a;
    console.log("Result: "+ result);
    return result;
});

// ==== PREFIX UNARY OPERATOR TO CREATE FUNCTION EXPRESSION ====
+function square(a) {
    var result = a * a;
    console.log("Result: "+ result);
    return result;
};

IIFE – Immediately-Invoked Function Expression

We can not immediately invoke function declaration. Trying to do so will raise an syntaxt error as shown in below example.

JavaScript
// ==== CAN NOT IMMEDIATELY INVOKE FUNCTION DECLARATION =====
function printMessage() {
    console.log("Can not Immediately invoke function declaration.");
}();
// Syntaxt Error.

Add parenthesis () in the end of function expression to immediately invoke it.

JavaScript
// ==== Anonymous IIFE ====
(function() {
    console.log("Immediately invoked anonymous function.");
})();
// Output : Immediately invoked anonymous function.

// ==== Passing Parameter to Named IIFE =====
(function square(a) {
    var result = a * a;
    console.log("Result: "+ result);
    return result;
})(2);
// Output : Result: 4

Usage : Encapsulation in JS using IIFE

We can achieve encapsulation in javascript using IIFE. Well known Javascript libraries like Backbone.js, jQuery.js etc… uses IIFE.

We are using IIFE to create a simple calculator in the following example. Using IIFE, we are hiding num1 and num2 variable from being global and exposing only necessary methods of calculator functionality.

JavaScript
(function(calculator){
    var num1 = 0;
    var num2 = 0;

    calculator.setNum1 = function(n1) {
        num1 = n1;
    };
    calculator.setNum2 = function(n2) {
        num2 = n2;
    },
    calculator.add = function() {
        return (num1 + num2);
    };
    calculator.subtract = function() {
        return (num1 - num2);
    };
    calculator.multiply = function() {
        return (num1 * num2);
    };
    calculator.divide = function() {
        return (num1 / num2);
    };
})(window.calculator = window.calculator || {});

calculator.setNum1(10); // Set num1 to 10
calculator.setNum2(5); // Set num1 to 5
console.log("Add : "+ calculator.add());
console.log("Subtract : "+ calculator.subtract());
console.log("Multiply : "+ calculator.multiply());
console.log("Divide : "+ calculator.divide());

// Output :
// Add : 15
// Subtract : 5
// Multiply : 50
// Divide : 2

References

Ben Alman’s blog post