2013-08-26 8 views
6

Sto provando a costruire un gioco e ho notato che per l'organizzazione potrebbe essere meglio inserire alcune funzioni all'interno di altre funzioni perché sono utilizzate esclusivamente nella funzione originale. Per esempio:Quale posizionamento della funzione Javascript è migliore?

function fn1() 
{ 
    fn2(); 

    function fn2() 
    { 
     //Stuff happens here 
    } 
} 

fn1 viene chiamato molte volte, e fn1 chiamerà fn2 più volte nella sua esecuzione. Quando viene chiamato fn1, il numero fn2 deve essere rielaborato (per mancanza di una parola migliore) ogni volta? Sto perdendo in termini di prestazioni a causa di questo? Dovrei invece inserire fn2 dopo fn1, in questo modo?

function fn1() 
{ 
    fn2(); 
} 

function fn2() 
{ 
    //Stuff happens here 
} 

risposta

2

Si può fare questo per ottenere scoping simili, ma creare solo una copia di fn2:

//Initiliaze before you call `fn1`: 
var fn1 = (function(){ 

    // This is the function assigned to fn1 
    return function(){ 
     fn2(); 
    } 

    function fn2() 
    { 
     //Stuff happens here 
    } 
})(); 

Confrontare l'output della console di questi per violini, il primo dei quali crea una copia extra del fn2 , dal momento che un scope localmente fn2 viene creato per ogni chiamata a fn1: http://jsfiddle.net/A2UvC/3/ e http://jsfiddle.net/A2UvC/3/

ci sono vantaggi al additiona l copie di fn2 tuttavia. Possono avere accesso a diverse variabili, come nella seguente situazione:

function fn1(x){ 

    // Return an object exposing fn2 to the caller's scope 
    return {fn2: fn2}; 

    // Each call to fn1 creates a new fn2 which has access 
    // to the closured `x` from the call to fn1 that created it 
    function fn2(){ 
     console.log(x); 
    } 

} 

var ex1 = fn1(1); 
var ex2 = fn1(2); 

ex1.fn2 == ex1.fn2; // true 
ex1.fn2 == ex2.fn2; // false, because they are two distinct copies 

ex1.fn2(); // 1 
ex2.fn2(); // 2 
ex2.fn2(); // 2 
ex1.fn2(); // 1 
+0

Poiché non si racchiude la funzione di espressione tra parentesi, forse si vuole indicare esplicitamente che si sta chiamando immediatamente la funzione esterna. Materiale di lettura rilevante: http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

+1

@FelixKling Ho aggiunto la parentesi per renderlo più ovvio. – Paulpro

+1

+1 :-) Inoltre, puoi spiegare se la prima via dell'OP crea più copie di fn2 –

Problemi correlati