Todo el mundo lo conoce thisen javascript, pero también hay casos selfen los que se encuentran en la naturaleza, como aquí.
Entonces, ¿cuál es la diferencia entre thisy selfen JavaScript?
javascript
Ben Nelson
fuente
fuente

window.self(=== window). Aunque el OP probablemente significa un nombre de variable trivial…this === selfes cierto :-)thisaselfno 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 enthissí 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
selfeswindowporque JavaScript le permite acceder a cualquier propiedadxdewindowsimplementex, en lugar dewindow.x. Por lo tanto,selfes 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
thispredeterminado eswindow, y por lo tantoSi está utilizando una función en un contexto diferente,
thisse referirá a ese contexto, peroselfseguirá siendo asíwindow.Puede encontrar
window.selfdefinido en el borrador de trabajo del W3C 2006 para el Objeto Ventana aquí .fuente
selfes útil en el contexto de WebWorker cuando no se puede acceder a la ventana ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Usar enselflugar de lewindowpermite 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