2010-11-19 23 views
6

W aplikacji internetowej opartej na jQuery mam różne skrypty, w których można umieścić wiele plików i używam tylko jednego z nich na raz (wiem, że nie wszystkie z nich byłyby lepsze, ale ja jestem odpowiedzialny za WS, więc to nie moja decyzja). Więc jestem owijanie każdego pliku w initModule() funkcji, która rejestruje różne zdarzenia i wykonuje pewne inicjalizacji itdFunkcje prywatne w JavaScript

Teraz jestem ciekaw, czy są jakieś różnice pomiędzy dwa sposoby definiowania funkcji nie zaśmiecania globalnej przestrzeni nazw:

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

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

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

    /* do some stuff here */ 
} 

i

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

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

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

    /* do some stuff here */ 
} 
+0

Spójrz na [to pytanie] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

Odpowiedz

8

główną różnicą między tymi dwoma podejściami polega na tym, gdy funkcja będzie dostępna. W pierwszym przypadku funkcja staje się dostępna po deklaracji, ale w drugim przypadku jest dostępna w całym zakresie (nazywa się to podnosząc).

poza tym - są w zasadzie takie same.

+3

Jedyna inna różnica polega na tym, że w przeciwieństwie do funkcji utworzonej przez funkcję exprerssion, funkcja utworzona przez deklarację funkcji ma nazwę, która pojawi się w łańcuchowej reprezentacji funkcji w niektórych przeglądarkach, co może pomóc podczas debugowania. Nazwa funkcji pojawia się także we właściwości 'name' obiektu funkcji w niektórych przeglądarkach. –

+0

Deklaracja funkcji ustawia właściwość name funkcji, ale to zachowanie nie jest zdefiniowane przez żaden standard, jest słabo obsługiwane przez różne przeglądarki, a zatem nie można na nich polegać. Ale punkt jest poprawny - jest to różnica między deklaracją funkcji a deklaracją. – Andris

+0

Dla większej przejrzystości dzieje się tak dlatego, że deklaracja funkcji jest "wyciągnięta" (cytuje, ponieważ jest nieco bardziej skomplikowana niż przenoszenie deklaracji) podobnie jak deklaracje zmiennych. W przypadku użycia wyrażenia funkcji tylko część deklaracji zmiennej jest podnoszona. – Matt

0

jest to model, który pomógł mi zarządzać moduły w javascript:

base.js:

var mod = {}; 

mod.functions = (function(){ 

    var self = this; 

    self.helper1 = function() { 

    } ; 

    self.helper2 = function() { 

    } ; 

    return self; 

}).call({}); 

module_one.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({}); 
Powiązane problemy