2012-04-16 13 views
5

Ho lavorato al progetto web negli ultimi 4 mesi. Per ottimizzare le prestazioni del codice, abbiamo utilizzato un modello. Il mio dubbio è, in realtà aumenta le prestazioni o no?javascript questo oggetto

quando mai dobbiamo usare l'oggetto this assegnarlo a una variabile locale e usarlo.

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

il presupposto è che, assegnando this oggetto a una variabile di stack locale incrementare le prestazioni.

Non ho mai visto questo tipo di codifica, quindi dubito che non serva.

EDIT: So che assegnare questo oggetto alla variabile locale è fatto per preservare l'oggetto, ma non è il nostro caso.

+1

È estremamente comune in roba Node.js. Ma questo è più per mantenere un riferimento nei callback, al contrario di un aumento delle prestazioni, credo. – Chad

+1

Immagino che questo sia effettivamente * peggiore * per le prestazioni. Google Closure Compiler (con ottimizzazioni avanzate) rimuoverà la dichiarazione var e sostituirà le istanze di 'thisObject' con' this', anche se l'utilizzo di una variabile comporterebbe spesso una dimensione minima ridotta. Il compilatore di chiusura ottimizza la velocità e le dimensioni, ma sembra preferire la velocità alle dimensioni quando ha una scelta. –

risposta

7

Mentre questa è una pratica comune in Javascript è non eseguita per motivi di prestazioni. Il salvataggio dell'oggetto this in un altro locale denominato viene in genere eseguito per preservare il valore di this attraverso i callback definiti all'interno della funzione.

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

o meno thisObject === this viene valutata a true dipenderà da come si chiama

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

abbiamo usato questo modello in funzioni semplici che non hanno alcun callback o così. quello che voglio sapere è che ha un incremento delle prestazioni? –

+0

@TejeshAlimilli è molto improbabile che questo abbia una differenza di prestazioni notevole – JaredPar

+0

Grazie. questo è quello che volevo sapere. –

0

Anche quando questo tipo di ottimizzazione ha un effetto (positivo), è molto probabile che dipendono l'interprete.

Un'altra versione può annullare i risultati.

Tuttavia, alla fine è necessario misurare, non indovinare.

2

Come per TUTTE le domande sulle prestazioni, dovrebbero essere esaminate misurando effettivamente le prestazioni. In un rather simple test case (il codice di effettiva può variare un po '), trovo risultati misti attraverso i browser:

enter image description here

Chrome e Firefox non differiscono molto tra le due prove, ma la leggera differenza è nel opposta le direzioni tra i due. IE9 mostra il test utilizzando una copia salvata di this che ho chiamato self per essere notevolmente più lento.

Senza una differenza significativa e coerente in termini di prestazioni in Chrome e Firefox e IE9 che mostrano il caso di test this sostanzialmente più veloce, penso che si possa concludere che il modello di progettazione richiesto non stia offrendo un incremento costante delle prestazioni tra i vari browser.

Nel mio codice, ho salvare una copia di this ad un'altra variabile solo quando ne ho bisogno per un riferimento costante per l'oggetto originale all'interno di gestori di eventi, in linea callback o metodi in cui this è stato impostato su qualcos'altro. In altre parole, applico questo schema di progettazione solo quando necessario.

In un previous discussion of this design pattern here on SO, si è concluso che alcune librerie usano questo modello di progettazione al fine di consentire ulteriore minimizzazione perché this non può essere minimizzato al di sotto dei quattro personaggi che occupa, ma assegnandolo ad una variabile locale può essere minimizzato a un nome variabile a carattere singolo.

+0

Opera sembra ottimizzare il test case, stanno funzionando esattamente nello stesso tempo :-) – Bergi