2011-10-07 7 views
5

stavo correndo un programma per cambiare alcune parti del mio codice JavaScript quando si spiati nella dichiarazione di una var come una funzione come questa:C'è qualche vantaggio nel definire il nome della funzione in "var new_function = function name() {};" in javascript?

var some_function = function name(args){ 
//do stuff 
}; 

Il codice stesso funziona, ma mi stavo chiedendo se è ok rimuovere il "nome" per tutte le funzioni che trovo in questo modo (per non romperlo nell'altro problema che analizza il mio javascript) o se potrebbe essere utile per quello che non riesco a vedere.

rimuovendo il "nome":

var new_function = function(){/*do stuff*/}; 

Nota: il file originale in cui prima era accaduto in jquery-1.6.4.js in:

jQuerySub.fn.init = function init(selector, context) { 
    if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { 
     context = jQuerySub(context); 
    } 

    return jQuery.fn.init.call(this, selector, context, rootjQuerySub); 
}; 

ty per qualsiasi aiuto in anticipo :)

risposta

6

L'identificatore name delle espressioni di funzione è accessibile solo all'interno della funzione stessa.

Nel tuo esempio jQuery l'identificatore init non è nemmeno usato, quindi penso che l'unico vantaggio per citarne la funzione è solo a scopo di debug, un debugger sarà in grado di mostrare il nome della funzione in una lunga pila di chiamate .

Confronta:

anonymous functions on stack

vs.

named functions on stack

svantaggi esistono, una lunga bug su IE < = 8 rende le espressioni di funzione chiamati a trapelare l'identificativo nome al suo racchiude campo di applicazione, inoltre, la creazione di due oggetti funzione, ad esempio:

var foo = function bar() {}; 

typeof bar; // "function" on IE 
foo === bar; // false, two different objects 

per evitare gli effetti collaterali di questo problema ci sono diverse soluzioni, ad esempio, per lavorare all'interno di una funzione immediatamente chiamato, per creare una dichiarazione di funzione in tale ambito, e restituirla, ad esempio:

jQuerySub.fn.init = (function() { 
    function init(selector, context) { 
    //... 
    } 

    return init; 
})(); 

E altri modi simili, ti consiglierei di controllare il seguente articolo:

+0

Uno svantaggio è che le espressioni di funzione denominata creeranno due funzioni in IE afaik (o qualcosa di simile). –

+1

@FelixKling, aggiunta una nota su NFE. – CMS

+0

Ty per la tua risposta. Ho appena provato anche in firefox 7.0.1 e riconosce il nome all'interno della funzione ma non fuori da if. – Seeker

Problemi correlati