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
this
dentro 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)
self
se utiliza para mantener una referencia al originalthis
incluso 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
self
ahora se desaconseja el uso comowindow.self
existe 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
self
apunta al objeto global de una ventana normal o de un WebWorker.Para evitar confusiones y posibles conflictos, puede escribir
var thiz = this
o en suvar that = this
lugar.fuente
_this
that
" (a lo que mi cerebro nunca se acostumbrará).self
, siempre y cuando lo declare comovar
responsable, 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
self
se usa dentro de las funciones llamadas por eventos? Esos tendrían su propio contexto, por lo queself
se utiliza para mantener lothis
que entróNote()
.La razón
self
aú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
self
no tiene un significado especial. Personalmente, prefiero usar una var con un nombre diferente,self
ya 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 = this
o similar.También debe tenerse en cuenta que hay un patrón Proxy alternativo para mantener una referencia al original
this
en una devolución de llamada si no le gusta elvar self = this
idioma.Como se puede llamar a una función con un contexto dado usando
function.apply
ofunction.call
, puede escribir un contenedor que devuelva una función que llame a su función conapply
ocall
usando el contexto dado. Vea laproxy
función de jQuery para una implementación de este patrón. Aquí hay un ejemplo de uso:var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
entonces se puede llamar y tendrá su versiónthis
como 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
this
y 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.
this
en la función se referirá a otro objeto. De esta forma, puede hacer que la función contenga una referencia athis
en 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 = this
con 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 = this
avar 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