2012-01-19 11 views
8

Diciamo che sto facendo alcune animazioni con la tela HTML5. Se sto cercando di animare metodo di un oggetto, che sarebbe preferibile, le prestazioni saggio (supponendo che non mi importa di IE8):setTimeout sul metodo oggetto - bind ES5 o chiusura?

setTimeout(this.render.bind(this), 15); 

o

var self = this; 
setTimeout(function() { self.render() }, 15); 

Il mio caso particolare, non è abbastanza intenso da fare davvero una differenza visivamente; Sto solo cercando di scoprire le migliori pratiche.

Penso che la creazione di una nuova funzione con bind avrebbe un sovraccarico minore rispetto alla creazione di una chiusura, ma volevo chiedere agli esperti.

+1

questo odore su mi ottimizzazione, quindi ancora non so qual è il tuo problema, ma penso che sia sicuro di dire che il 75% delle volte questo non importa – mkoryak

+0

Entrambi creano una chiusura, l'unica differenza è quale scopo quelle funzioni sono limitate in ... –

+2

@mkoryak - è solo un eccesso di ottimizzazione se stai facendo più lavoro. Entrambi sono triviali da implementare e mi chiedevo quale sia (potenzialmente) più performante. –

risposta

5

domande di prestazioni JavaScript sono complicato, perché i vari motori là fuori hanno caratteristiche molto diverse prestazioni. Ciò che è veloce su un motore è lento su un altro.

tuo chiusura dovrebbe essere molto velocemente; dopotutto, tutte le funzioni sono chiusure e la vostra variabile self è definita nel contesto immediatamente contenente (quindi non c'è molta attenzione alla catena di visibilità per esso).

Ma in teoria, un motore che supporta le funzionalità ES5 in modo nativo potrebbe ottimizzare il modo in cui funziona bind, rendendolo ancora più veloce (non è necessario nemmeno una sola ricerca della catena dell'ambito).

Ha importanza? No. Userei ciò che ha senso per te. Si noti che IE8 non è l'unico browser là fuori che ancora non ha ES5 dispone nativamente (anche se è sempre possibile utilizzare uno degli spessori ES5, a differenza di alcune caratteristiche ES5, bind può essere perfettamente emulato da spessori in codice ES3   — anche se per farlo devono usare call/apply, che può essere più lento di una chiusura su alcuni motori).