javascriptself-executing-function

Javascript - self-executing functions : why to use them if I can create local scope with not self-executing functions?


I know there are a lot of posts here and elsewhere about selfexecuting functions but I still have some questions after reading posts.

  1. why would I ever assign a self-executing function to a variable? If seems that they execute themselves anyways.

    var myFunc=(function() {
     console.log('Hello World');
    })();
    
  2. I read a lot that the reason to use self-executing functions is to keep variables private. If I have a not self-executing function, everything I define inside that function is gonna be private anyways?!

    (function() {
     var name="my Name"
     console.log(name);
    })();
    
    vs.
    
     function() {
     var name="my Name"
     console.log(name);
     };
     //its the same
    

So I dont quite understand how self-executing functions are to keep local scope (as you can do that using not self-executing functions) so the only reason I see is to use them when you want to execute automatically for example on page load.

Thanks!

just one more question:

var test=(function myFunc(){
      var name="Hello World"
      return {
        test1: function(){
          return name;
        },
        test2:function(){
          return name+"1"
        }
      }
    })()

    test.test1()

vs

    var test=function myFunc(){
      var name="Hello World"
      return {
        test1: function(){
          return name;
        },
        test2:function(){
          return name+"1"
        }
      }
    }

    test.test1()

--> what exactly happens here that because of IIFE I can actually execute test.test1() and not with a regular function?


Solution

  • You usually wrap your functions in a anonymous function when you want to keep your scope contained. This is also part of the module pattern which is still pretty popular:

    https://toddmotto.com/mastering-the-module-pattern/

    Then you can assign the outcome of that IIFE to a variable so your scope can only be accessed by calling that variable.

    myScope.myLocallyScopedProperty or myScope[myLocallyScopedProperty]
    

    Your other function needs to be called manually and it also accessible from anywhere.

    I suggest reading the article by Todd Moto it explains a lot.