omfång - Privata funktioner i JavaScript


I en jQuery-baserad webbapplikation har jag olika skript där flera filer kan inkluderas och jag använder bara en av dem åt gången (jag vet att det vore bättre att inte inkludera alla, men jag ansvarar bara för JS så det är inte mitt beslut). Så jag kapslar in varje fil i en initModule()-funktion som registrerar olika händelser och gör viss initialisering osv.

Nu är jag nyfiken på om det finns några skillnader mellan följande två sätt att definiera funktioner utan att städa ner det globala namnutrymmet:

function initStuff(someArg) {
    var someVar = 123;
    var anotherVar = 456;

    var somePrivateFunc = function() {
        /* ... */
    }

    var anotherPrivateFunc = function() {
        /* ... */
    }

    /* do some stuff here */
}

och

function initStuff(someArg) {
    var someVar = 123;
    var anotherVar = 456;

    function somePrivateFunc() {
        /* ... */
    }

    function anotherPrivateFunc() {
        /* ... */
    }

    /* do some stuff here */
}

Svar #1

Den största skillnaden mellan dessa två tillvägagångssätt ligger i när funktionen blir tillgänglig. I det första fallet blir funktionen tillgänglig efter deklarationen, men i det andra fallet är den tillgänglig genom hela omfånget (det kallas hoisting).

function init(){
    typeof privateFunc == "undefined";
    var privateFunc = function(){}
    typeof privateFunc == "function";
}

function init(){
    typeof privateFunc == "function";
    function privateFunc(){}
    typeof privateFunc == "function";
}

Annars är de i princip likadana.

Svar #2

detta är en modell som hjälpte mig att hantera moduler i javascript:

base.js:

var mod = {};

mod.functions = (function(){

    var self = this;

    self.helper1 = function() {

    } ;

    self.helper2 = function() {

    } ;

    return self;

}).call({});

modul_ett.js

mod.module_one = (function(){

  var 
    //These variables keep the environment if you need to call another function
    self = this, //public (return)
    priv = {};   //private function

  priv.funA = function(){
  }

  self.somePrivateFunc = function(){
     priv.funA();
  };

  self.anotherPrivateFunc = function(){

  };

  // ini module

  self.ini = function(){

     self.somePrivateFunc();
     self.anotherPrivateFunc();

  };

  // ini/end DOM

  $(function() {

  });

  return self; // this is only if you need to call the module from the outside
               // exmple: mod.module_one.somePrivateFunc(), or mod.module_one.ini()

}).call({});