2012-05-14 13 views
12

estoy leyendo la fuente de mongoose¿Por qué asignar `this` a` self` y ejecutar `self.method()`?

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    self.doQueue(); 
}; 

No entiendo por qué el autor asigna a thisself y corre self.doQueue(). ¿Por qué no ejecutar simplemente:

this.buffer = false; 
this.doQueue(); 

Soy nuevo en javascript, gracias por su ayuda.

Respuesta

14

Tiene razón, en este caso, simplemente podrían haber usado this.

El uso de me o self es se usa un poco de un truco para asegurar el contexto correcto de this, como dentro de JavaScript del alcance de this es variante. Si, por ejemplo, tiene un evento que activa una función dentro de su clase, this sería diferente, y no sería su objeto el que alberga la función, sino el objeto que llamó a la función. Para resolver esto, las personas a menudo usan me o self para asegurarse de que se están refiriendo al objeto correcto ... this, como en el objeto real.

-1

self es una copia de 'esto', pero siempre se refiere al objeto correcto, y 'esto' no.

+0

Será menos que crear un nuevo ámbito de la función. – ThiefMaster

+2

Esta es una linda respuesta de * hand waving * sin ejemplos y sin una explicación * real *. – Matt

2

La única razón por la que normalmente haría eso es si la llamada al doQueue() está dentro de un bloque que cambiará el valor de this, como otra función.

En este caso, sin embargo, no sirve para nada y probablemente fue un remanente de un código anterior que no se modificó.

2

Lo más probable es que el desarrollador haya querido coherencia, pero no lo haya hecho.

De lo contrario, estaría utilizando this en algunas funciones, self en otras funciones y a mix of both en otras funciones, dependiendo del lugar donde se utiliza el objeto y si se utiliza funciones anidadas/devoluciones de llamada.

Por always assigning this to self y luego usar este último tiene una asignación adicional en el comienzo de cada función, sino que siempre uso self para acceder al objeto.

Sin embargo, lo que el desarrollador hizo en el código que publicó no tiene mucho sentido. Él debe usar self o this ambas veces en lugar de una mezcla que ni siquiera es necesaria.

+0

... pero en la línea de arriba está haciendo 'this.buffer = false;'. – Matt

2

sólo para dar más claridad a @richard dijo anteriormente,

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    this.onclick = function(){ 
    //do some other operations here 
    //if you refer `this` here then, `this` will refer to present function not the above. so to make sure it is referring to exact object people pass this to `me` or `self` 
    self.doQueue(); 
    } 
}; 
+1

puede proponer una edición a su respuesta en lugar de saturar la publicación, gracias. –

Cuestiones relacionadas