2010-11-19 16 views
6

In un'applicazione Web basata su jQuery dispongo di vari script in cui è possibile includere più file e sto solo utilizzando uno di questi in una volta (non so che includere tutti loro sarebbe meglio, ma io sono solo responsabile per il JS, quindi non è una mia decisione). Così sto avvolgendo ogni file in una funzione initModule() che registra vari eventi e fa un po 'di inizializzazione eccFunzioni private in JavaScript

Ora io sono curioso di sapere se ci sono delle differenze tra i due seguenti modi di definire funzioni non ingombrano lo spazio dei nomi globale:

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

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

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

    /* do some stuff here */ 
} 

e

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

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

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

    /* do some stuff here */ 
} 
+0

Date un'occhiata a [questa domanda] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

risposta

8

la principale differenza tra questi due approcci risiede nel fatto quando la funzione diventa disponibile. Nel primo caso la funzione diventa disponibile dopo la dichiarazione, ma nel secondo caso è disponibile per tutta la portata (si chiama di sollevamento).

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

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

diverso da quello - sono praticamente uguali.

+3

L'unica altra differenza è che a differenza di una funzione creata da un'esprestazione di funzione, una funzione creata da una dichiarazione di funzione ha un nome, che verrà visualizzato nella rappresentazione di stringa della funzione in alcuni browser, che può essere d'aiuto durante il debug. Il nome della funzione compare anche nella proprietà 'name' dell'oggetto funzione in alcuni browser. –

+0

La dichiarazione di funzione imposta la proprietà name della funzione, ma questo comportamento non è definito da alcuno standard, è mal supportato tra diversi browser e quindi non può essere considerato affidabile. Ma il punto fatto è corretto - questa è una differenza tra dichiarazione di funzione e dichiarazione. – Andris

+0

Per maggiore chiarezza, questo è perché la dichiarazione della funzione è "issata" (virgolette perché è un po 'più complicato che semplicemente spostando la dichiarazione) molto simile alle dichiarazioni variabili. Quando si utilizza un'espressione di funzione viene issata solo la parte di dichiarazione variabile. – Matt

0

questo è un modello che mi ha aiutato a gestire i moduli in 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({}); 
Problemi correlati