Vi lo siguiente en la fuente de WebKit HTML 5 SQL Storage Notes Demo :
function Note() {
var self = this;
var note = document.createElement('div');
note.className = 'note';
note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
note.addEventListener('click', function() { return self.onNoteClick() }, false);
this.note = note;
// ...
}
El autor usa self en algunos lugares (el cuerpo de la función) y esto en otros lugares (los cuerpos de las funciones definidos en la lista de argumentos de los métodos). ¿Que esta pasando? Ahora que lo he notado una vez, ¿comenzaré a verlo en todas partes?
javascript
scope
closures
Thomas L Holaday
fuente
fuente

thisdentro de una devolución de llamada?")Respuestas:
Vea este artículo en alistapart.com . (Ed: El artículo ha sido actualizado desde el enlace original)
selfse utiliza para mantener una referencia al originalthisincluso cuando el contexto está cambiando. Es una técnica de uso frecuente en los controladores de eventos (especialmente en cierres).Editar: Tenga en cuenta que
selfahora se desaconseja el uso comowindow.selfexiste y tiene el potencial de causar errores si no tiene cuidado.Lo que llamas variable no importa particularmente.
var that = this;está bien, pero no hay nada mágico en el nombre.Las funciones declaradas dentro de un contexto (por ejemplo, devoluciones de llamada, cierres) tendrán acceso a las variables / funciones declaradas en el mismo alcance o superior.
Por ejemplo, una devolución de llamada de evento simple:
fuente
var that = this;Creo que el nombre de la variable 'self' ya no debería usarse de esta manera, ya que los navegadores modernos proporcionan una variable global que
selfapunta al objeto global de una ventana normal o de un WebWorker.Para evitar confusiones y posibles conflictos, puede escribir
var thiz = thiso en suvar that = thislugar.fuente
_thisthat" (a lo que mi cerebro nunca se acostumbrará).self, siempre y cuando lo declare comovarresponsable, va a sombrear lo global. Por supuesto, si olvidaste elvar, tampoco funcionaría con ningún otro nombre.Sí, lo verás en todas partes. Es a menudo
that = this;.¿Ves cómo
selfse usa dentro de las funciones llamadas por eventos? Esos tendrían su propio contexto, por lo queselfse utiliza para mantener lothisque entróNote().La razón
selfaún está disponible para las funciones, aunque solo pueden ejecutarse una vez que laNote()función ha terminado de ejecutarse, es que las funciones internas obtienen el contexto de la función externa debido al cierre .fuente
selfno tiene un significado especial. Personalmente, prefiero usar una var con un nombre diferente,selfya que con frecuencia me confunde, ya que espero que 'self' sea una palabra reservada. Entonces me gusta tu respuesta. Y en el ejemplo del OP, preferiríavar thisNote = thiso similar.También debe tenerse en cuenta que hay un patrón Proxy alternativo para mantener una referencia al original
thisen una devolución de llamada si no le gusta elvar self = thisidioma.Como se puede llamar a una función con un contexto dado usando
function.applyofunction.call, puede escribir un contenedor que devuelva una función que llame a su función conapplyocallusando el contexto dado. Vea laproxyfunción de jQuery para una implementación de este patrón. Aquí hay un ejemplo de uso:var wrappedFunc = $.proxy(this.myFunc, this);wrappedFuncentonces se puede llamar y tendrá su versiónthiscomo contexto.fuente
Como otros han explicado,
var self = this;permite que el código en un cierre haga referencia al ámbito principal.Sin embargo, ahora es 2018 y ES6 es ampliamente compatible con todos los principales navegadores web. El
var self = this;idioma no es tan esencial como lo era antes.Ahora es posible evitarlo
var self = this;mediante el uso de funciones de flecha .En casos donde hubiéramos usado
var self = this:Ahora podemos usar una función de flecha sin
var self = this:Las funciones de flecha no tienen las suyas propias
thisy simplemente asumen el alcance envolvente.fuente
.addEventListender("click", (x) => { console.log(x); });ha explicado el cómo y el por qué muy claramente, y estoy de acuerdo en que usar las funciones de flecha tiene más sentido, pero aún así ... esto es simplemente terrible, vago, desordenado, la programación.La variable es capturada por las funciones en línea definidas en el método.
thisen la función se referirá a otro objeto. De esta forma, puede hacer que la función contenga una referencia athisen el ámbito externo.fuente
Es una peculiaridad de JavaScript. Cuando una función es una propiedad de un objeto, más acertadamente llamado método, esto se refiere al objeto. En el ejemplo de un controlador de eventos, el objeto contenedor es el elemento que activó el evento. Cuando se invoca una función estándar, esto se referirá al objeto global. Cuando ha anidado funciones como en su ejemplo, esto no se relaciona en absoluto con el contexto de la función externa. Funciones internas hacen alcance acción con la función que contiene, por lo que los desarrolladores podrán utilizar variaciones de
var that = thiscon el fin de preservar el este que necesitan en la función interna.fuente
En realidad, self es una referencia a window (
window.self), por lo tanto, cuando dicevar self = 'something'que anula una referencia de ventana a sí mismo, porque self existe en el objeto de ventana.Es por eso que la mayoría de los desarrolladores prefieren
var that = thisavar self = this;De todas formas;
var that = this;no está en línea con las buenas prácticas ... suponiendo que su código sea revisado / modificado más tarde por otros desarrolladores, debe usar los estándares de programación más comunes con respecto a la comunidad de desarrolladoresPor lo tanto, debe usar algo como var
oldThis/var oThis/ etc, para que quede claro en su alcance // .. no es tanto, pero ahorrará unos segundos y pocos ciclos cerebralesfuente
Como se mencionó varias veces anteriormente, 'self' simplemente se usa para mantener una referencia a 'this' antes de ingresar a la función. Una vez en la función 'esto' se refiere a otra cosa.
fuente
thisss.sayHi.call (thatt);
fuente