No se trata de rendimiento, se trata de acceder a una propiedad de una instancia específica de un objeto: -
x.init()
, no se mostrará 'prueba' si no hubiera this
utilizar en la función.
eficazmente la línea de arriba es la misma que: -
x.init.call(x);
la primera parámetro de en el uso de call
se asigna a this
cuando se ejecuta la función.
Ahora tener en cuenta: -
var fn = x.init; //Note no() so the function itself is assigned to the variable fn
fn();
Ahora usted no consigue nada en la alerta. Esto debido a que el anterior es efectiva: -
fn.call(window);
En navegador Javascript acogió el objeto window
es sinónimo con el objeto global. Cuando una función se denomina "en bruto", el this
se establece de forma predeterminada en el objeto global.
El error clásico es hacer algo como esto: -
var x = {
ele: 'test';
init: function(elem) {
elem.onclick = function() { alert(this.ele); }
}
}
x.init(document.getElementById('myButton'));
Sin embargo, esto no funciona porque la función de adjunto al evento onclick es llamado por el navegador usando un código como: -
onclick.call(theDOMElement)
Por lo tanto, cuando la función se está ejecutando this
no es lo que cree que es.
Mi solución habitual a esta situación es la siguiente: -
var x = {
ele: 'test';
init: function(elem) {
var self = this;
elem.onclick = function() { alert(self.ele); }
elem = null;
}
}
x.init(document.getElementById('myButton'));
Nota del elem = null
es pérdida de memoria IE solución temporal.
No es solo usted, este es uno de los aspectos más confusos del idioma. Deberías obtener algunas buenas respuestas; Estoy deseando leerlos. –