Non si tratta di prestazioni, si tratta di accesso a una proprietà di una specifica istanza di un oggetto: -
x.init()
non visualizzerebbe 'test' se non aveste utilizzare this
nella funzione.
efficacemente la riga precedente è la stessa: -
x.init.call(x);
primo paramater nell'uso di call
è assegnato a this
quando viene eseguita la funzione.
Ora considerare: -
var fn = x.init; //Note no() so the function itself is assigned to the variable fn
fn();
ora si ottiene nulla in allerta. Questo perché quanto sopra è efficace: -
fn.call(window);
nel browser ospitato Javascript l'oggetto window
è sinonimo di oggetto globale. Quando una funzione è chiamata "nel raw", il valore this
viene impostato automaticamente sull'oggetto globale.
L'errore classico sta facendo qualcosa di simile: -
var x = {
ele: 'test';
init: function(elem) {
elem.onclick = function() { alert(this.ele); }
}
}
x.init(document.getElementById('myButton'));
Tuttavia questo non funziona perché la funzione collegata al l'evento onclick viene chiamato dal browser utilizzando il codice come: -
onclick.call(theDOMElement)
Quindi quando la funzione è in esecuzione this
non è quello che pensi che sia.
mia solita soluzione a questa situazione è: -
var x = {
ele: 'test';
init: function(elem) {
var self = this;
elem.onclick = function() { alert(self.ele); }
elem = null;
}
}
x.init(document.getElementById('myButton'));
Annotare il elem = null
è IE perdita di memoria work-around.
Non è solo per te - questo è uno degli aspetti più confusionari della lingua. Dovresti ottenere delle buone risposte; Non vedo l'ora di leggerli. –