2011-08-24 24 views
9

mi rendo conto che è utile (per motivi di prestazioni) per fare qualcosa di simile ...Qual è il punto di riassegnazione delle variabili degli argomenti?

function Abc(a, b, c) { 
    var window = window; 

Così, quando il codice accede window, non ha bisogno di andare a monte della catena campo di applicazione a trovare finalmente window. Lo stesso può essere fatto per document, navigator, ecc ...

Ma io sono nel processo di riscrittura alcuni dei MobiScroll jQuery plugin e abbiamo trovato questo ...

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

Quali sono i vantaggi di reinizializzare elm e dw per indicare le loro variabili argomento?

Ho letto molto sull'accesso a arguments costosa, ma non ho mai letto nulla sul perché questa potrebbe essere una buona pratica.

Quali sono i vantaggi nel fare questo?

In passato, ho deliberately removed questo costrutto dalla documentazione di MDN.

+0

Mai visto. Lascia che il motore si preoccupi delle "ottimizzazioni". –

+0

@ pst Sono d'accordo. Tuttavia, ho una mente curiosa ... – alex

+1

È più o meno un duplicato di [Javascript - Devo usare "var" quando si riassegna una variabile definita nei parametri della funzione?] (Http://stackoverflow.com/questions/2495174/javascript-do-i-need -per-uso-var-quando-riassegnazione-a-variabile definita-in-the-fu). Tuttavia, non so se queste sono le risposte che vuoi. –

risposta

2
> function Abc(a, b, c) { 
>  var window = window; 

Così, quando il codice accede finestra, non ha bisogno di risalire la catena dell'area di validità per trovare finalmente la finestra.

Non penso che sia la ragione. Per una funzione dichiarata nell'ambito globale, la risoluzione di un identificatore localmente rispetto a tutto il mondo sarà insignificamente più veloce (e forse più lenta a seconda del browser).

script possono usare qualcosa simile al precedente per assicurare finestra riferisce finestra oggetto previsto e non qualche altro finestra sulla catena portata, ad esempio

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

Nel secondo esempio:

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

Dichiarazione delle variabili è completa perdita di tempo. Inserire un identificatore nell'elenco di parametri formale di una dichiarazione di funzione o espressione equivale a dichiararlo in modalità localizzazione con var. Dichiarare tali identificatori come variabili locali non ha alcun effetto.

C'era una versione precedente di Safari che aveva un problema con i parametri formali a cui non era passato un valore, ma era molto tempo fa ed era solo un problema in un caso molto specifico.

+0

+1 grazie RobG, questa è un'ottima risposta. – alex

+2

Riguardo alla prima parte della risposta: Sì, per le funzioni globali, non ci sarà una grande differenza. Ma spesso le funzioni sono nidificate in altre funzioni, usate come callback ecc. E ha senso avere qualsiasi oggetto il più vicino possibile. Dipende anche da quanto spesso * accede a un determinato oggetto. Una regola generale è, se si accede a una proprietà o ad un oggetto più di una volta, memorizzarlo in una variabile locale. –

+0

@Felix King Non uso affatto questa regola empirica - la mia regola generale è "... se rende il codice più leggibile/gestibile allora ..." che ha * nulla * da fare con "prestazioni "o" contare ". –

0

L'unico motivo logico è potenzialmente Chiarire quali possibilità la variabile è stata dichiarata in.

Altri poi che si aggiunge solo il codice in eccesso.