Todo el mundo lo conoce this
en javascript, pero también hay casos self
en los que se encuentran en la naturaleza, como aquí.
Entonces, ¿cuál es la diferencia entre this
y self
en JavaScript?
javascript
Ben Nelson
fuente
fuente
window.self
(=== window
). Aunque el OP probablemente significa un nombre de variable trivial…this === self
es cierto :-)this
aself
no es una gran práctica hoy en día cuando es común que tiene código con muchos (bueno, más de uno es bastante malo) niveles de anidamiento de devolución de llamada, como consecuencia de la programación asincrónica. En su lugar, utilice un nombre más descriptivo. Hablando objetivamente, el nombre enthis
sí mismo no contiene información y es solo una mala elección de nombre porque el contexto léxico de una definición de clase lo califica.Respuestas:
A menos que se establezca en otro lugar, el valor de
self
eswindow
porque JavaScript le permite acceder a cualquier propiedadx
dewindow
simplementex
, en lugar dewindow.x
. Por lo tanto,self
es realmentewindow.self
, que es diferente athis
.Si está utilizando una función que se ejecuta en el ámbito global y no está en modo estricto, el valor
this
predeterminado eswindow
, y por lo tantoSi está utilizando una función en un contexto diferente,
this
se referirá a ese contexto, peroself
seguirá siendo asíwindow
.Puede encontrar
window.self
definido en el borrador de trabajo del W3C 2006 para el Objeto Ventana aquí .fuente
self
es útil en el contexto de WebWorker cuando no se puede acceder a la ventana ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Usar enself
lugar de lewindow
permite acceder al objeto global de forma portátil.Una pequeña adición a esto, ya que las personas pueden encontrar esto en el contexto de los trabajadores de servicios, en cuyo caso significa algo ligeramente diferente.
Es posible que vea esto en un módulo de trabajador de servicio:
Aquí self se refiere a WorkerGlobalScope, y este es el método estándar para configurar los detectores de eventos.
De los documentos de Mozilla :
fuente
Aunque llego tarde aquí, encontré un ejemplo que también puede ser útil para comprender mejor
this
:O / P
fuente
Es necesario aclarar la referencia a ECMA 5.
Supongo que significa ECMA-262 Edición 5. Cabe señalar que ECMA-262 (también conocido como ECMAScript o, menos exactamente, Javascript) es un lenguaje de programación general que se ha implementado en los navegadores de Internet. Del estándar Edition 5.1:
El término "objeto global" se refiere a cualquier objeto que se encuentre en la parte superior de la cadena de alcance. Para los navegadores, este sería el objeto "ventana", pero esta es una opción de implementación (Windows Script Host tiene un objeto global invisible pero no un modo estricto, por lo que las referencias no calificadas acceden a sus propiedades y no hay un "yo" global). Además, el "modo estricto" debe habilitarse explícitamente; de lo contrario, no estará activo (sección 14.1 del estándar). Como tal, un "esto" no definido todavía se resolvería en el objeto global (ventana) en "ECMA 5" con el modo estricto no activo.
Entonces la respuesta a la pregunta es:
"esto" siempre se refiere al objeto que invoca la función. Si la función no fue invocada por un objeto (es decir, no una llamada a un método), entonces "esto" (como se le pasó a la función) es "indefinido". Sin embargo, si NO usa el modo estricto, entonces un "esto" no definido se establece en el objeto global (regla 2 anterior).
"self" no tiene un significado sintáctico especial, es solo un identificador. Los navegadores tienden a definir window.self (solo una propiedad del objeto de ventana global) = window. Esto da como resultado referencias incondicionales de que "self" es lo mismo que "window" A MENOS QUE "self" se haya redefinido dentro de un ámbito adjunto (como por ejemplo, "var self = this;" arriba. Buena suerte redefiniendo "this").
Entonces, la explicación completa del ejemplo anterior es:
Una variación interesante del ejemplo crea un cierre al devolver una referencia a la función interna.
Productor
Tenga en cuenta que la función interna no se llama hasta que la invoca yourObject. Entonces this.foo ahora es yourObject.foo pero self todavía se resuelve en la variable en el ámbito adjunto que, en el momento en que se devolvió el objeto de función interna, era (y en el cierre resultante todavía es) myObject. Entonces, dentro de la función interna, "esto" se refiere al objeto que llama a la función interna mientras que "self" se refiere al objeto que llamó a la función externa para crear la referencia a la función interna.
Para resumir el resumen del resumen, "esto" está definido por el estándar del lenguaje, "self" lo define quien lo define (implementador de tiempo de ejecución o programador final).
fuente
Encuentre a continuación algunas combinaciones de las salidas de la consola 'ventana', 'self' y 'this' en el ámbito global (entorno del navegador) para ver a dónde se refiere.
fuente