He notado que no parece ser una explicación clara de lo que el this
de palabras clave y cómo está correctamente (e incorrectamente) que se utilizan en JavaScript en el Desbordamiento de la Pila sitio.
He sido testigo de algunos muy extraño comportamiento con ella y no han logrado entender por qué se ha producido.
¿Cómo this
trabajo y cuándo debe utilizarse?
He encontrado esto cuando busqué en google «esto» quirksmode.org/js/this.html
Algunas de las preguntas relacionadas con * jQuery/JavaScript puntero «this» confusión * En Javascript, ¿por qué es el «este» operador incompatible? y una buena valoración crítica aquí * ámbito de aplicación/contexto en javascript
Pedro Michaux para la lucha contra el uso de
El MDN panorama no es la mitad de malo… developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
Una interesante explicación de la
Algunas de las preguntas relacionadas con * jQuery/JavaScript puntero «this» confusión * En Javascript, ¿por qué es el «este» operador incompatible? y una buena valoración crítica aquí * ámbito de aplicación/contexto en javascript
Pedro Michaux para la lucha contra el uso de
this
pedro.michaux.ca/artículos/javascript-widgets-sin-esteEl MDN panorama no es la mitad de malo… developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
Una interesante explicación de la
this
palabras clave: rainsoft.io/suave-explicación-de-esta-en-javascriptOriginalEl autor Maxim Gershkovich | 2010-06-27
La
this
palabra clave se comporta de forma diferente en JavaScript en comparación con otros idiomas. En lenguajes Orientados a Objetos, elthis
palabra clave hace referencia a la instancia actual de la clase. En JavaScript, el valor dethis
está determinada principalmente por el contexto de invocación de la función (context.function()
) y donde se llama.1. Cuando se utiliza en el contexto global
Cuando se utiliza
this
en el contexto global, es obligado a objeto global (window
en el navegador)Cuando se utiliza
this
dentro de una función definida en el contexto global,this
todavía está enlazado a objeto global ya que la función es un método de contexto global.Por encima de
f1
se realiza un método de objeto global. Por lo tanto, podemos llamar también enwindow
objeto de la siguiente manera:2. Cuando se usa en el método de objeto de
Cuando se utiliza
this
palabra clave dentro de un método de objeto,this
está vinculado a la «inmediata», adjuntando el objeto.Arriba he puesto la palabra inmediata en comillas dobles. Es para hacer el punto de que si te nido el objeto dentro de otro objeto, entonces
this
está obligado a la inmediata padre.Incluso si se añade la función explícitamente al objeto como un método, que aún así sigue por encima de las reglas, que es
this
todavía puntos a la inmediata objeto primario.3. Cuando invoque a menos del contexto de la función
Cuando se utiliza
this
dentro de la función que se invoca sin ningún tipo de contexto (es decir, no sobre cualquier objeto), está vinculada a la de objeto global (window
en el navegador)(incluso si la función está definida en el objeto) .Tratando con funciones
Podemos tratar los puntos anteriores con las funciones. Sin embargo, hay algunas diferencias.
this
. para especificar ellos.new
operador.A continuación he probado todas las cosas que hicimos con el Objeto y
this
arriba, pero por primera función de creación en lugar de escribir directamente un objeto.4. Cuando se utiliza dentro de la función constructora.
Cuando se utiliza la función como un constructor (que es cuando se llama con
new
palabra clave),this
dentro de la función de los puntos del cuerpo para el nuevo objeto que está siendo construido.5. Cuando se utiliza dentro de la función definida en el prototipo de la cadena de
Si el método es un objeto prototipo de la cadena,
this
dentro de este método se refiere al objeto, el método fue llamado, como si el método está definido en el objeto.6. Dentro de la llamada (), () y bind() funciones
Function.prototype
.this
que va a ser utilizado mientras se ejecuta la función. También se tienen los parámetros que se pasan a la función original cuando se le invoca.fun.apply(obj1 [, argsArray])
Conjuntos deobj1
como el valor dethis
dentro defun()
y llamadasfun()
pasando elementos deargsArray
como sus argumentos.fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
– Estableceobj1
como el valor dethis
dentro defun()
y llamadasfun()
pasandoarg1, arg2, arg3, ...
como sus argumentos.fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
– Devuelve la referencia a la funciónfun
conthis
dentro de diversión obligado aobj1
y parámetros defun
obligado a los parámetros especificadosarg1, arg2, arg3,...
.apply
,call
ybind
debe de haber vuelto evidente.apply
permite especificar los argumentos de la función como de la matriz-como objeto, es decir, un objeto con una numéricolength
de la propiedad y su correspondiente número entero no negativo propiedades. Mientras quecall
permite especificar los argumentos de la función directamente. Ambosapply
ycall
inmediatamente se invoca la función en el contexto específico y con los argumentos especificados. Por otro lado,bind
simplemente devuelve la función enlazada a la especificadathis
y el valor de los argumentos. Podemos captar la referencia a esta devuelta por la función de asignar a una variable y después nos puede llamar en cualquier momento.7.
this
dentro de los controladores de eventosthis
directamente dentro de la gestión de eventos de la función se refiere al elemento correspondiente. Tal función directa de la asignación se puede hacer uso deaddeventListener
método o a través de los eventos tradicionales métodos de registro comoonclick
.this
directamente dentro de la propiedad de evento (como<button onclick="...this..." >
) del elemento, se refiere al elemento.this
indirectamente a través de otra función llamada dentro de la gestión de eventos de la función o evento de la propiedad se resuelve en el objeto globalwindow
.attachEvent
. En lugar de asignar la función al controlador de eventos (y por lo tanto, haciendo que el método de función del elemento), se llama a la función en el evento (efectivamente llamando en el contexto global).Recomiendo mejor probar esto en JSFiddle.
hmm puede ser, pero me he encontrado con esta en MDN: En este caso, el valor de
this
no se establece la llamada. Puesto que el código no es en modo estricto, el valor dethis
debe ser siempre un objeto de modo que el valor predeterminado es el objeto global. Y de hecho es por eso que yo pensaba que directamente puede realizar llamada dewindow.f1()
, lo que significa quef1()
ya está conectado awindow
objeto, quiero decir antes de la invocación. Estoy equivocando?Yo estaba comentando (tal vez no con claridad, en su vinculación a la configuración de esto con «la función en realidad es un método en el contexto mundial», como si una especie de llamado
window.fn
, que no lo es. esto valor por defecto el objeto global porque no hay base de referencia se utiliza en la llamada, no porque de donde la función está definida (por lo que esto está todavía por cómo se llama a la función). Si usted llamar explícitamente utilizandowindow.fn
, entonces usted es la configuración de esto de la ventana. Mismo resultado, diferente manera de ir sobre él. 🙂«yo he puesto la palabra inmediata…» no, tú no. Puede usted por favor revisar esto para que se corrige el error? Parece semántica para la respuesta y por lo tanto no se puede continuar la lectura hasta que se corrige el error por miedo de aprender algo incorrecto.
hacer Ctrl+F en esta página en el navegador para encontrar la cadena «inmediata» (incluyendo las comillas) yo creo que ahí si estoy entendiendo mal u
OriginalEl autor Mahesha999
Javascript
this
Simple invocación de función
Considere la siguiente función:
Nota que estamos ejecutando este en el modo normal, es decir, el modo estricto no se utiliza.
Cuando se ejecuta en un navegador, el valor de
this
sería registra comowindow
. Esto es debido a quewindow
es la variable global en un navegador web de su ámbito.Si ejecuta este mismo fragmento de código en un entorno como el de node.js,
this
haría referencia a la variable global en su aplicación.Ahora si ejecutamos este en modo estricto por la adición de la declaración de
"use strict";
a los principios de la declaración de la función,this
ya no se refieren a la variable global en cualquiera de los envirnoments. Esto se hace para evitar confusiones en el modo estricto.this
sería, en este caso sólo tienes que entrarundefined
, porque eso es lo que es, no está definido.En los siguientes casos, podríamos ver cómo manipular el valor de
this
.Llamar a una función en un objeto
Hay diferentes maneras de hacer esto. Si han llamado a los métodos nativos en Javascript como
forEach
yslice
, usted ya debe saber que elthis
variable en ese caso se refiere a laObject
en el que se llama a esa función (tenga en cuenta que javascript, casi todo es unObject
, incluyendoArray
s yFunction
s). Usa el siguiente código de ejemplo.Si un
Object
contiene una propiedad que tiene unaFunction
, la propiedad es llamada a un método. Este método, cuando se llama, siempre esthis
conjunto de variables para laObject
la que está asociada. Esto es cierto tanto para el estricto y no estricto modos.Tenga en cuenta que si un método es almacenada (o más bien, copiado) en otra variable, la referencia a
this
es que ya no se conservan en la nueva variable. Por ejemplo:Considerando más comúnmente escenario de práctica:
La
new
palabra claveConsiderar un constructor de la función en Javascript:
¿Cómo funciona esto? Bien, vamos a ver lo que ocurre cuando se utiliza el
new
palabra clave.new
palabra clave inmediatamente initialze unObject
de tipoPerson
.Object
tiene su constructor establece enPerson
. También, tenga en cuenta quetypeof awal
volveríaObject
sólo.Object
se le asigna el protoype dePerson.prototype
. Esto significa que cualquier método o propiedad en laPerson
prototipo estaría disponible para todas las instancias dePerson
, incluyendoawal
.Person
en sí es ahora invoca;this
ser una referencia a la recién construida objetoawal
.Bastante straighforward, eh?
Tenga en cuenta que el oficial de la especificación ECMAScript no se donde se señala que los tipos de funciones reales
constructor
funciones. Ellos son sólo funciones normales, ynew
puede ser utilizado en cualquier función. Es sólo que usamos como tal, y por eso las llamamos como tal sólo.Funciones de llamada Funciones :
call
yapply
Así que sí, ya que
function
s también sonObjects
(y en el hecho primero de la clase de variables en Javascript), incluso las funciones de disponer de métodos que son… bueno, funciones themselved.Todas las funciones heredan de la global
Function
, y dos de sus muchos métodos soncall
yapply
, y ambos pueden ser usados para manipular el valor dethis
en la función en la que están llamados.Este es un ejemplo típico de uso de
call
. Básicamente, tiene el primer parámetro y establecethis
en la funciónfoo
como una referencia athisArg
. Todos los demás parámetros que se pasan acall
se pasan a la funciónfoo
como argumentos.Por lo que el código anterior registro de
{myObj: "is cool"}, [1, 2, 3]
en la consola. Muy buena forma de cambiar el valor dethis
en cualquier función.apply
es casi el mismo comocall
aceptar que sólo toma dos parámetros:thisArg
y una matriz que contiene los argumentos que se pasan a la función. Por lo que la anteriorcall
llamada puede ser traducido aapply
como este:Nota que
call
yapply
puede reemplazar el valor dethis
establecidas por el dot de invocación de método que hemos discutido en la segunda viñeta.Bastante Simple 🙂
Presentación….
bind
!bind
es un hermano decall
yapply
. También es un método heredado por todas las funciones desde el mundialFunction
constructor en Javascript. La diferencia entrebind
ycall
/apply
es que tantocall
yapply
realmente invocar la función.bind
, por el contrario, devuelve una nueva función con lathisArg
yarguments
pre-establecido. Veamos un ejemplo para entender mejor este:Ver la diferencia entre los tres? Es sutil, pero se utilizan de manera diferente. Como
call
yapply
,bind
también superan el valor dethis
establecidas por el dot-la invocación del método.También tenga en cuenta que ninguna de estas tres funciones de hacer cualquier cambio en la función original.
call
yapply
devuelve el valor de los recién construido, mientras que las funcionesbind
devolverá el recién construido función de sí mismo, listo para ser llamado.Cosas extras, copia este
A veces, no le gusta el hecho de que
this
cambios con el alcance, especialmente anidada alcance. Echa un vistazo al siguiente ejemplo.En el código anterior, podemos ver que el valor de
this
cambiado con anidada alcance, pero queríamos que el valor dethis
en el ámbito original. Así que ‘copiar’this
athat
y utiliza la copia en lugar dethis
. Inteligente, ¿eh?Índice:
this
por defecto?new
palabra clave?this
concall
yapply
?bind
.this
para resolver nested-cuestiones de ámbito.new
palabra clave? También esta pregunta ha sido vencer a la muerte, pero todos tenemos «que el tiempo nos trató de montar los faldones de la levita de una pregunta respondida hace 4 años»OriginalEl autor Awal Garg
«esto» es todo acerca de alcance. Cada función tiene su propio ámbito, y puesto que todo en JS es un objeto, incluso una función puede almacenar valores en sí mismo usando el «este». La programación orientada a objetos 101 enseña que «esto» sólo es aplicable a instancias de un objeto. Por lo tanto, cada vez se ejecuta una función, una nueva «instancia» de que la función tiene un nuevo significado de «este».
La mayoría de la gente se confunde cuando intenta utilizar «this» dentro de anónimo cierre funciones como:
Así que aquí, en el interior de cada uno ()», este» no es el «valor» que se espera (de
por encima de él). Así, para obtener más de esta (ningún retruécano previsto) problema, un desarrollador podría:
Probarlo; te empiezan a gustar este patrón de programación
Los valores primitivos parecen tener algunos de los métodos en sí mismos, como Cadena#substring(), el Número#toString(), etc.. Así, tal vez no con la misma nomenclatura que en el artículo, en realidad, se comportan como si fueran objetos (todos ellos son un prototipo, es decir. Cadena#substring() es realmente: String.el prototipo.subcadena = function(){…}). Por favor me corrija si estoy equivocado.
El
this
palabra clave no tiene nada que ver con el ámbito. También, tiene un significado también en funciones que no son propiedades de los objetos.son dos escuelas de pensamiento sobre eso. Me gusta la que dice «todo es un objeto, pero algunos pueden ser representados por primitivas para la comodidad«. 😉
this
no es TODO sobre el ámbito de aplicación. Es TODO acerca de la ejecución de contexto, que no es lo mismo como ámbito de aplicación. JavaScript es léxicamente ámbito (significado alcance está determinado por la ubicación del código), perothis
está determinado por la función que contiene se invoca – no se donde que la función es.OriginalEl autor arunjitsingh
this
en Javascript se refiere siempre a la «dueño» de la función que se ser ejecutado.Si no explícito del propietario se define, entonces, la parte superior de la mayoría de propietario, el objeto de la ventana, se hace referencia.
Por lo que si hice
element.onclick = someKindOfFunction;
this
haría referencia al elemento objeto. Pero cuidado, muchas personas cometen este error<element onclick="someKindOfFunction()">
En el último caso, usted se limita a hacer referencia a la función, no la mano sobre el elemento. Para ello,
this
hará referencia al objeto window.OriginalEl autor Seph
Ya que este hilo se ha topado, he recopilado algunos de los puntos para los lectores nuevos a
this
tema.¿Cómo es el valor de
this
determinado?Utilizamos esta similar a la manera en que usamos los pronombres en los lenguajes naturales, como el inglés: «Juan está corriendo más rápido porque él está tratando de coger el tren.» En su lugar se podría haber escrito «… Juan está tratando de coger el tren».
this
no se le asigna un valor hasta que un objeto se invoca la función donde está definido. En el ámbito global, todas las variables globales y funciones están definidas en elwindow
objeto. Por lo tanto,this
en una función global se refiere (y tiene el valor de) el globalwindow
objeto.Cuando
use strict
,this
en global y en funciones anónimas que no están ligados a ningún objeto tiene un valor deundefined
.La
this
palabra clave es la mayoría de los incomprendidos cuando: 1) tomamos prestado un método que utilizathis
, 2) se le asigna un método que utilizathis
a una variable, 3) una función que utilizathis
se pasa como una función de devolución de llamada, y 4)this
se utiliza dentro de un cierre — interior de la función. (2)Qué le depara el futuro
Definido en ECMA Script 6, flecha-funciones de adoptar la
this
vinculante a partir de laadjuntando (función o global) ámbito de aplicación.
Mientras flecha-funciones de proporcionar una alternativa al uso de
bind()
, es importante tener en cuenta que ellos son esencialmente la desactivación de la tradicionalthis
mecanismo en favor de los más ampliamente entendido léxico de alcance. (1)Referencias:
OriginalEl autor carlodurso
Cada
funciónel contexto de ejecución en javascript tiene unalcancecontextoeste parámetro que se establece por:Cualquier cosa que alcance contexto, se hace referencia a «este».Puede
cambiarestablece el valor de estealcancecontextoel uso defunc.call
,func.apply
ofunc.bind
.Por defecto, y lo que confunde a la mayoría de los principiantes, cuando un
devolución de llamadaoyente se llama después de que un evento se produce en un elemento de DOM, elalcance de contextoeste valor de la función es el elemento DOM.jQuery hace que este trivial cambiar con jQuery.proxy.
this
en Javascript es que no una propiedad intrínseca de la función en sí, sino más bien un artefacto de la forma en que se invoca la función.gracias. ¿qué causa la mayor confusión acerca de esto en js es el hecho de que en todos los idiomas utilizados anteriormente (c#, c++), esto no puede ser manipulado n siempre apunta a la instancia del objeto, mientras que en js depende y puede ser cambiado cuando la invocación de funciones mediante
func.call
,func.bind
etc. – Sushilthis
no no de referencia en el ámbito de una función.this
hará referencia a un objeto específico (o posiblementeundefined
), que como hemos dicho puede ser cambiado usando.call()
o.apply()
. Una función de alcance es (esencialmente, cuando simplificado) de las variables que se tiene acceso, y esto depende enteramente donde la función es declarada y no puede ser cambiado.«Es un poco más correcto decir que cada llamada a la función tiene un ámbito de aplicación.» Aún más correcto decir que las funciones (y ahora los bloques) han alcance, la función de llamadas contexto. El alcance define lo que los identificadores que pueden ser utilizados por el código de ese ámbito. El contexto define lo que los identificadores son limitados.
«todo Lo que el alcance es, se hace referencia a «este».» No,
this
y ámbito de aplicación no tienen nada que ver el uno con el otro en ES5 y antes (por ejemplo, cuando esta respuesta fue escrito). En ES2015 (aka ES6),this
y ámbito de aplicación son las relacionadas con la un bastante mínimo manera wrt flecha funciones (lathis
en una flecha función es heredada de su ámbito envolvente), perothis
nunca se refiere a un ámbito.OriginalEl autor blockhead
Aquí es una buena fuente de
this
enJavaScript
.Aquí está el resumen:
global de este
En un navegador, en el ámbito global,
this
es elwindow
objetoEn
node
el uso de la repl,this
es la parte superior del espacio de nombres. Puede referirse a él comoglobal
.En
node
la ejecución de un script,this
en el ámbito global, se inicia como un objeto vacío. No es lo mismo comoglobal
función de este
Excepto en el caso de DOM controladores de eventos o cuando un
thisArg
(ver más abajo), tanto en el nodo y en un explorador conthis
en una función que no es llamado connew
referencias en el ámbito global…Si utiliza
use strict;
, en cuyo casothis
seráundefined
Si se llama a una función con
new
lathis
será un nuevo contexto, no de referencia mundialthis
.Funciones de crear convertido en objetos de función. Se obtiene automáticamente una especial
prototype
de la propiedad, que es algo que usted puede asignar valores. Cuando se crea una instancia por llamar a la función connew
usted consigue el acceso a los valores que se asignan a laprototype
de la propiedad. Usted tiene acceso a esos valores mediantethis
.Suele ser un error asignar matrices o objetos en el
prototype
. Si desea que las instancias que tienen cada uno sus propias matrices, cree en la función, no el prototipo.Puede utilizar
this
en cualquier función de un objeto para hacer referencia a otras propiedades de ese objeto. Este no es el mismo como una instancia creada connew
.En un HTML DOM controlador de eventos,
this
es siempre una referencia al elemento DOM en el evento se adjunta aA menos que usted
bind
el contextoDentro de los atributos de HTML en el que usted puede poner JavaScript,
this
es una referencia al elemento.Puede utilizar
eval
para acceder athis
.Puede utilizar
with
para agregarthis
a la actual alcance a leer y escribir a los valoresthis
sin hacer referencia athis
explícitamente.de jQuery en muchos lugares se han
this
se refieren a un elemento de DOM.OriginalEl autor zangw
Daniel, impresionante explicación! Un par de palabras sobre este y una buena lista de
this
contexto de ejecución puntero en el caso de los controladores de eventos.En dos palabras,
this
en JavaScript puntos el objeto de quién (o de cuyo contexto de ejecución) de la función se ejecute, y siempre es de sólo lectura, no se puede establecer de todos modos (por ejemplo un intento de acabar con ‘Invalid lado izquierdo de la asignación de un mensaje.Para los controladores de eventos: en línea de controladores de eventos, tales como
<element onclick="foo">
, con exclusión de cualquier otro controladores de los adjuntos anterior y antes, así que tenga cuidado y que es mejor mantenerse fuera de eventos en línea delegación.Y gracias a Zara Alaverdyan que me inspiró a esta lista de ejemplos a través de un disidente debate 🙂
el.onclick = foo; //in the foo - obj
el.onclick = function () {this.style.color = '#fff';} //obj
el.onclick = function() {doSomething();} //In the doSomething -
Window
el.addEventListener('click',foo,false) //in the foo - obj
el.attachEvent('onclick, function () { //this }') //window, all the
compliance to IE :)
<button onclick="this.style.color = '#fff';"> //obj
<button onclick="foo"> //In the foo - window, but you can <button
onclick="foo(this)">
OriginalEl autor Arman McHitarian
Hay mucha confusión con respecto a cómo «este» palabra clave es interpretado en JavaScript. Esperemos que este artículo va a sentar a todos aquellos a descansar de una vez por todas. Y un montón más. Por favor leer todo el artículo con cuidado. Ten en cuenta que este artículo es largo.
Con independencia del contexto en el que se utiliza, «este» siempre hace referencia a la «objeto actual» en Javascript. Sin embargo, lo que el «objeto actual» se difiere según contexto. El contexto puede ser exactamente 1 de los 6 siguientes:
Continuación se describe cada uno de estos contextos, uno por uno:
Contexto Global (es decir, Fuera de todas las funciones):
Fuera de todas las funciones (es decir, en el contexto global) el «actual
objeto» (y por lo tanto el valor de «este») es siempre el
«ventana» objeto para navegadores.
Dentro Directa «No Vinculado A La Función» Llamada:
Dentro de un Directo «No Vinculado a la Función» Llamada, el objeto de que
invoca la llamada a la función se convierte en el «objeto actual» (y por lo tanto
el valor de «este»). Si se llama a una función sin un explícito objeto actual, el objeto actual es el «ventana» objeto (No en Modo Estricto) o indefinido (Para el Modo Estricto) . Cualquier función (o variable), definido en el
Contexto Global automáticamente se convierte en una propiedad de la «ventana» objeto.Para el correo.g Supongamos que la función se define en el Contexto Global como
se convierte en la propiedad del objeto window, como si se han definido
como
En «No de Modo Estricto», Llamando/Invocar esta función directamente a través de «UserDefinedFunction()» llamar automáticamente a/invoke
como «de la ventana.UserDefinedFunction()» hacer «ventana» como el
«objeto actual» (y por lo tanto el valor de «este») dentro de «UserDefinedFunction».La invocación de esta función en «No de Modo Estricto» se producirá en el siguiente
En «Modo Estricto», Llamando/Invocando a la función directamente a través de
«UserDefinedFunction()» se «NO» automáticamente de llamar o invocar como «de la ventana.UserDefinedFunction()».De ahí el «actual
objeto» (y el valor de «este») dentro de
«UserDefinedFunction» será indefinido. La invocación de esta función en «Modo Estricto» se producirá en el siguiente
Sin embargo, invocando explícitamente el uso de la ventana de objeto tendrá como resultado
el siguiente
Veamos otro ejemplo. Por favor mira el siguiente código
En el ejemplo anterior, podemos ver que cuando «UserDefinedFunction» fue
invoca a través de o1, «este» toma el valor de o1 y la
el valor de sus propiedades «a» y «b» obtener muestra. El valor
de «c» y «d» se muestra como indefinido como o1 ¿
no definir estas propiedades
De manera similar cuando se «UserDefinedFunction» se invocan a través de o2,
«este» toma el valor de o2 y el valor de sus propiedades «c» y «d» obtener muestra.El valor de «a» y «b» se muestra como indefinido como o2 no definir estas propiedades.
Dentro Indirecta «No Vinculado a la Función» Llamada a través de functionName.llame y functionName.aplicar:
Cuando un «No Vinculado a la Función» se llama a través de
functionName.llame o functionName.aplicar, el «objeto actual» (y por lo tanto el valor de «este») se establece en el valor de
«este» parámetro (primer parámetro) pasó a de llamada y aplicar. El código siguiente muestra el mismo.
El código anterior muestra claramente que el «este» valor «NO
Vinculado a la Función» puede ser alterada a través de la de llamada y aplicar. También,si el
«este» parámetro no está explícitamente pasa a de llamada y aplicar, «objeto actual» (y por lo tanto el valor de «este») se establece en «ventana» No de modo estricto y «undefined» en modo estricto.
En el interior «, Vinculados a la Función» Llamada (es decir, una función que ha sido obligado por llamar functionName.se unen):
Una función es una función cuyo «este» valor ha sido
fijo. El código siguiente se demuestra cómo «este» obras en caso de que
de obligado función
Como se indica en el código de arriba, «este» valor para cualquiera «, Vinculados a la Función»
NO puede ser alterada a través de la llamada/aplicar. También, si el «este»
parámetro no está explícitamente pasa a enlazar, «objeto actual»
(y, por tanto, el valor de «este» ) se establece para «ventana» en No
de modo estricto y «undefined» en modo estricto. Una cosa más.
La unión de una ya obligado de la función no cambia el valor de «este».
Queda definido como el valor establecido por primera función de enlace.
Mientras que la Creación de Objetos a través de la «nueva»:
Dentro de una función constructora de la «objeto actual» (y, por tanto, el valor de
«este») hace referencia al objeto que está siendo creado
a través de «nuevo» independientemente del estado de enlace de la función. Sin embargo
si el constructor es una función que será llamada con
conjunto predefinido de argumentos como para establecer el límite de la función.
Interior en línea DOM controlador de eventos:
Por favor mira el siguiente Fragmento de código HTML
La «este» en los ejemplos anteriores se refieren a «botón» elemento y el
«div» elemento respectivamente.
En el primer ejemplo, el color de la fuente del botón se ajustará a la
blanco cuando se hace clic en él.
En el segundo ejemplo, cuando el «div» elemento se hace clic en él se
llame a la OnDivClick función con su segundo parámetro
hace referencia al hecho clic elemento div. Sin embargo, el valor de «este»
dentro de OnDivClick NO referencia el hecho clic div
elemento. Será establecido como el la ventana de»objeto» o
«undefined» en No estricta y Estricto Modos de respectivamente (si OnDivClick es un independiente de la función) o ajustada a un predefinidos
Valor del límite (si OnDivClick es un obligado función)
La siguiente resume el artículo completo
En el Contexto Global «este» se refiere siempre a la «ventana» objeto
Cuando una función se invoca, se invoca en el contexto de un
objeto («objeto actual»). Si el objeto actual no está expresamente previsto,
el objeto actual es el la ventana de»objeto» en NO Estrictos
Modo de y «undefined» en Modo Estricto por defecto.
El valor de «este» dentro de un No Obligado función es la referencia al objeto en el contexto de la cual se invoca la función («objeto actual»)
El valor de «este» dentro de un No Obligado función puede ser anulada por
llamada y aplicar métodos de la función.
El valor de «este» es fijo para una función y no puede ser
anulada por llamada y aplicar métodos de la función.
De unión y ya obligado de la función no cambia el valor de «este». Queda definido como el valor establecido por primera función de enlace.
El valor de «este» dentro de un constructor es el objeto que se está
crea e inicializa
El valor de «este» dentro de una línea de DOM controlador de eventos es de referencia
para el elemento para el que el controlador de eventos es dado.
OriginalEl autor Arup Hore
Probablemente el más detallado y completo artículo sobre
this
es la siguiente:Suave explicación de ‘esta’ palabra clave ‘ en JavaScript
La idea detrás de
this
es entender que la invocación de la función de los tipos tienen la importancia significativa en la configuración dethis
valor.Cuando teniendo problemas en la identificación de
this
, no pregúntate a ti mismo:pero hacer pregúntate a ti mismo:
Para una función de flecha (caso especial de un contexto de transparencia) pregúntate a ti mismo:
Esta forma de pensar es correcta cuando se trata con
this
y te ahorrará dolores de cabeza.OriginalEl autor Dmitri Pavlutin
Esta es la mejor explicación que he visto. Entender JavaScripts con Claridad
Hay Cuatro Condiciones donde este puede ser confuso:
Él da ejemplos de código, de las explicaciones, y las correcciones de código que me pareció muy útil.
OriginalEl autor James Drinkard
Es difícil obtener una buena comprensión de la JS, o escribir más que nada trivial en ella, si no la comprende. Usted simplemente no puede permitirse el lujo de tomar una inmersión rápida 🙂 creo que la mejor manera de empezar con el JS es primero ver estos video conferencias por Douglas Crockford – http://yuiblog.com/crockford/, que cubre esto y aquello, y todo lo demás acerca de JS.
Ha, y ahora Crockford no como esto y programas sin utilizar. 😉
El enlace está muerto.
OriginalEl autor tathagata
En pseudoclassical términos, la forma en que muchos de conferencias enseñar a los ‘esta’ palabra clave ‘ es como un objeto instanciado por un objeto o clase de constructor. Cada vez que un nuevo objeto se construye a partir de una clase, imaginar que bajo el capó de una instancia local de un ‘este’ objeto se crea y se devuelve. Recuerdo que enseña como este:
OriginalEl autor mrmaclean89
this
es uno de los mal entendido concepto en JavaScript ya que se comporta de manera diferente de un lugar a otro. Simplemente,this
se refiere a la «propietario» de la función que se están ejecutando actualmente.this
ayuda a obtener el objeto actual (un.k.una. contexto de ejecución) con los que trabajamos. Si usted entiende en la que el objeto de la función actual es conseguir que se ejecuta, puede entender fácilmente lo actualthis
esAnterior, podemos crear 3 variables con el mismo nombre de ‘val’. Uno en el contexto global, uno de ellos dentro de obj y el otro en el interior de innerMethod de obj. JavaScript resuelve identificadores dentro de un contexto determinado por subir el ámbito de la cadena de locales a globales.
Pocos lugares donde
this
pueden ser diferenciadosLlamar a un método de un objeto
Cuando line1 se ejecuta, JavaScript, que establece un contexto de ejecución (CE) para la llamada a la función, la configuración de
this
a la objeto referenciado por lo que sucedió antes de que el último «.». así, en la última línea se puede entender quea()
fue ejecutado en el contexto global que es elwindow
.Con Constructor
this
puede ser usado para referirse al objeto que está siendo creadoCuando los nuevos
Person()
se ejecuta, un nuevo objeto es creado.Person
se llama y suthis
se establece en referencia a ese nuevo objeto.Llamada a la función
Si perdemos
new
palabra clave,whatIsThis
se refiere a la mayoría de contexto global se puede encontrar(window
)Con los controladores de eventos
Si el controlador de eventos es en línea,
this
se refiere al objeto globalCuando la adición de controlador de eventos a través de JavaScript,
this
se refiere al elemento DOM que ha generado el evento..apply()
.call()
y.bind()
var =
significa en JavaScriptOriginalEl autor Nipuna
El valor de «esto» depende del «contexto» en que se ejecuta la función. El contexto puede ser cualquier objeto o el objeto global, es decir, la ventana.
Por lo que la Semántica de «este» es diferente de los tradicionales lenguajes de programación orientada a objetos. Y causa problemas:
1. cuando una función se pasa a otra variable (lo más probable, una devolución de llamada); y 2. cuando el cierre se invoca desde un método de miembro de una clase.
En ambos casos, se establece en la ventana.
OriginalEl autor Trombe
Whould este ayuda? (La mayoría de la confusión de ‘esta’ en javascript que viene del hecho de que generalmente no está vinculada a su objeto, sino a la actual ejecución de alcance-que pueden no ser exactamente cómo funciona, pero siempre se siente como que para mí, ver el artículo para una explicación completa)
OriginalEl autor Simon Groenewolt
Un poco de info acerca de este palabra clave
Vamos a iniciar sesión
this
palabra clave para la consola en el ámbito global, sin más código, peroEn Cliente/Navegador
this
de palabras clave es un objeto global que eswindow
y
En Servidor/Node/tiempo de ejecución de Javascript
this
palabra clave es también un objeto global que esmodule.exports
Tenga en cuenta
exports
es sólo una referencia amodule.exports
OriginalEl autor unclexo
este uso para el Ámbito como este
valor de txt1 y txt es el mismo
en el ejemplo de Arriba
$(this)=$(‘#tbleName tbody tr’) es el Mismo
OriginalEl autor
Respuesta es Simple:
palabra»this» es siempre la persona a cargo en el contexto de la invocación. Ellos se mencionan a continuación.
SE LLAMA A LA FUNCIÓN CON LA PALABRA CLAVE NEW
Si se llama a la función con la palabra clave NEW, a continuación, ESTE estará obligado al objeto recién creado.
En el anterior, este estará obligado a ‘myCar’ objeto
SE LLAMA A LA FUNCIÓN EXPLÍCITAMENTE EL USO DE LA LLAMADA Y LA APLICACIÓN DE MÉTODOS.
En este caso, se enlazará con el objeto de que explícitamente se pasa a la función.
SI SE LLAMA A LA FUNCIÓN CON OBJETO DE FORMA IMPLÍCITA, A CONTINUACIÓN, ESTE ESTARÁ OBLIGADO A ESE OBJETO
CUANDO SE LLAMA A LA FUNCIÓN SIN NINGÚN TIPO DE CONTEXTO, A CONTINUACIÓN, ESTE ESTARÁ OBLIGADO A OBJETO GLOBAL
EN MODO ESTRICTO, ESTE SERÁ INDEFINIDO
}
en el punto 4OriginalEl autor PALLAMOLLA SAI
Recomiendo la lectura de Mike West‘s artículo Ámbito de aplicación en JavaScript (espejo) en primer lugar. Es un excelente, amable introducción a los conceptos de
this
y el alcance de las cadenas en JavaScript.Una vez que empiece a acostumbrarse a
this
, las reglas son en realidad bastante simple. El ECMAScript 5.1 Estándar definethis
:ThisBinding es algo que el intérprete de JavaScript mantiene como evalúa el código JavaScript, como un especial de registro de CPU que contiene una referencia a un objeto. El intérprete actualizaciones de la ThisBinding siempre que el establecimiento de un contexto de ejecución en uno de los tres casos diferentes:
1. Inicial ejecución global del contexto
Este es el caso de el código JavaScript que se evalúa en el nivel superior, por ejemplo, cuando directamente dentro de un
<script>
:Cuando la evaluación de código en la parte inicial del mundial de contexto de ejecución, ThisBinding se establece en el objeto global,
window
(§10.4.1.1).Entrar eval código
…por una llamada directa a
eval()
ThisBinding se queda sin cambios; es el mismo valor que la ThisBinding de la vocación contexto de ejecución (§10.4.2 (2)(a)).
…si no por una llamada directa a
eval()
ThisBinding se establece en el objeto global como si la ejecución en la fase inicial del mundial de contexto de ejecución (§10.4.2 (1)).
§15.1.2.1.1 define lo que es un llamado directo a la
eval()
es. Básicamente,eval(...)
es una llamada directa, mientras que algo como(0, eval)(...)
ovar indirectEval = eval; indirectEval(...);
es una llamada indirecta aeval()
. Ver chuckj la respuesta a (1, eval)(‘este’) vs eval(‘este’) en JavaScript? y Dmitry Soshnikov del ECMA-262-5 en detalle. Capítulo 2. De Modo Estricto. para cuando se puede usar una indirectaeval()
llamada.De entrar en el código de la función
Esto ocurre cuando se llama a una función. Si se llama a una función en un objeto, como en
obj.myMethod()
o el equivalenteobj["myMethod"]()
, entonces ThisBinding se establece en el objeto (obj
en el ejemplo; §13.2.1). En la mayoría de los otros casos, ThisBinding se establece en el objeto global (§10.4.3).La razón de la escritura «en la mayoría de los casos» es porque hay ocho ECMAScript 5 funciones integradas que permiten ThisBinding ser especificados en la lista de argumentos. Estas funciones toman un llamado
thisArg
que se convierte en el ThisBinding al llamar a la función (§10.4.3).Estas funciones integradas:
Function.prototype.apply( thisArg, argArray )
Function.prototype.call( thisArg [ , arg1 [ , arg2, ... ] ] )
Function.prototype.bind( thisArg [ , arg1 [ , arg2, ... ] ] )
Array.prototype.every( callbackfn [ , thisArg ] )
Array.prototype.some( callbackfn [ , thisArg ] )
Array.prototype.forEach( callbackfn [ , thisArg ] )
Array.prototype.map( callbackfn [ , thisArg ] )
Array.prototype.filter( callbackfn [ , thisArg ] )
En el caso de la
Function.prototype
funciones, que son llamados en un objeto de función, pero en lugar de establecer ThisBinding a la función de objeto, ThisBinding se establece en elthisArg
.En el caso de la
Array.prototype
funciones, lacallbackfn
se llama en un contexto de ejecución donde ThisBinding se establece enthisArg
si es facilitado; de lo contrario, al objeto global.Esas son las reglas de la llanura de JavaScript. Cuando empiece a utilizar las bibliotecas de JavaScript (por ejemplo, jQuery), es posible que ciertas funciones de la biblioteca de manipular el valor de
this
. Los desarrolladores de esas bibliotecas de JavaScript de hacer esto porque se tiende a apoyar el uso más común de los casos, y los usuarios de la biblioteca suele encontrar a este comportamiento es más conveniente. Al pasar funciones de devolución de llamada de referenciathis
a las funciones de biblioteca, debe consultar la documentación de garantías acerca de cuál es el valor dethis
es cuando se llama a la función.Si usted se está preguntando cómo una biblioteca de JavaScript manipula el valor de
this
, la biblioteca es el simple uso de una de las integradas en las funciones de JavaScript aceptar unthisArg
. Usted también puede escribir su propia función de tomar una función de devolución de llamada ythisArg
:Hay un caso especial que no me mención. Cuando se construye un nuevo objeto a través de la
new
operador, el intérprete de JavaScript crea un nuevo objeto vacío, establece algunas propiedades internas y, a continuación, llama al constructor de la función en el nuevo objeto. Por lo tanto, cuando se llama a una función en un constructor contexto, el valor dethis
es el nuevo objeto de que el intérprete creado:Flecha funciones
Flecha funciones (introducido en ECMA6) modificar el alcance de
this
. Ver los canónica pregunta, Función de flecha vs declaración de función /expresiones Son equivalentes /intercambiable? para obtener más información. Pero en resumen:Sólo por diversión, prueba tu comprensión con algunos ejemplos
Para mostrar las respuestas, pase el ratón sobre el amarillo de la luz cajas.
¿Cuál es el valor de
this
en la línea marcada? Por qué?¿Cuál es el valor de
this
en la línea marcada cuandoobj.staticFunction()
se ejecuta? Por qué?JS:
¿Cuál es el valor de
this
en la línea marcada? Por qué?JS:
¿Cuál es el valor de
this
en la línea marcada? Por qué?¿Cuál es el valor de
this
en la línea marcada? Por qué?JS:
setTimeout
ejemplo tiene unthis
dewindow(global)
.this
está dentro de la función de tiempo de espera, no es el «inicial de ejecución global» contexto de la regla que se aplica, pero el «cómo introducir el código de función» en la regla. Debido a que la función de tiempo de espera no se llama en un objeto (por ejemplo,someObject.someMethod()
),this
eswindow
dentro de la función de tiempo de espera, como el JSFiddle muestra.Array
prototipo (tan lejos comothis
va). Cualquier función o método podría aceptar y usar unthisArg
igual que si se utiliza.call()
o.apply()
internamente:function callTheFunc(f, thisArg) { f.call(thisArg) }
(obj.myFunction)()
aún se une a este obj? Yo supongo que la expresión entre paréntesis devuelve un no enlazados a la función, así que no debería ser de la ventana en su lugar?La
this
palabra clave se comporta de forma diferente en JavaScript en comparación con otros idiomas. En lenguajes Orientados a Objetos, elthis
palabra clave hace referencia a la instancia actual de la clase. En JavaScript, el valor dethis
está determinado por el contexto de invocación de la función (context.function()
) y donde se llama.1. Cuando se utiliza en el contexto global
Cuando se utiliza
this
en el contexto global, es obligado a objeto global (window
en el navegador)Cuando se utiliza
this
dentro de una función definida en el contexto global,this
todavía está enlazado a objeto global ya que la función es un método de contexto global.Por encima de
f1
se realiza un método de objeto global. Por lo tanto, podemos llamar también enwindow
objeto de la siguiente manera:2. Cuando se usa en el método de objeto de
Cuando se utiliza
this
palabra clave dentro de un método de objeto,this
está vinculado a la «inmediata», adjuntando el objeto.Arriba he puesto la palabra inmediata en comillas dobles. Es para hacer el punto de que si te nido el objeto dentro de otro objeto, entonces
this
está obligado a la inmediata padre.Incluso si se añade la función explícitamente al objeto como un método, que aún así sigue por encima de las reglas, que es
this
todavía puntos a la inmediata objeto primario.3. Cuando invoque a menos del contexto de la función
Cuando se utiliza
this
dentro de la función que se invoca sin ningún tipo de contexto (es decir, no sobre cualquier objeto), está vinculada a la de objeto global (window
en el navegador)(incluso si la función está definida en el objeto) .Tratando con funciones
Podemos tratar los puntos anteriores con las funciones. Sin embargo, hay algunas diferencias.
this
. para especificar ellos.new
operador.A continuación he probado todas las cosas que hicimos con el Objeto y
this
arriba, pero por primera función de creación en lugar de escribir directamente un objeto.4. Cuando se utiliza dentro de la función constructora.
Cuando se utiliza la función como un constructor (que es cuando se llama con
new
palabra clave),this
dentro de la función de los puntos del cuerpo para el nuevo objeto que está siendo construido.5. Cuando se utiliza dentro de la función definida en el prototipo de la cadena de
Si el método es un objeto prototipo de la cadena,
this
dentro de este método se refiere al objeto, el método fue llamado, como si el método está definido en el objeto.6. Dentro de la llamada(), aplicar() y bind() funciones
Function.prototype
.this
que va a ser utilizado mientras se ejecuta la función. También se tienen los parámetros que se pasan a la función original cuando se le invoca.fun.apply(obj1 [, argsArray])
Conjuntos deobj1
como el valor dethis
dentro defun()
y llamadasfun()
pasando elementos deargsArray
como sus argumentos.fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
– Estableceobj1
como el valor dethis
dentro defun()
y llamadasfun()
pasandoarg1, arg2, arg3, ...
como sus argumentos.fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
– Devuelve la referencia a la funciónfun
conthis
dentro de diversión obligado aobj1
y parámetros defun
obligado a los parámetros especificadosarg1, arg2, arg3,...
.apply
,call
ybind
debe de haber vuelto evidente.apply
permite especificar los argumentos de la función como de la matriz-como objeto, es decir, un objeto con una numéricolength
de la propiedad y su correspondiente número entero no negativo propiedades. Mientras quecall
permite especificar los argumentos de la función directamente. Ambosapply
ycall
inmediatamente se invoca la función en el contexto específico y con los argumentos especificados. Por otro lado,bind
simplemente devuelve la función enlazada a la especificadathis
y el valor de los argumentos. Podemos captar la referencia a esta devuelta por la función de asignar a una variable y después nos puede llamar en cualquier momento.7.
this
dentro de los controladores de eventosthis
directamente dentro de la gestión de eventos de la función se refiere al elemento correspondiente. Tal función directa de la asignación se puede hacer uso deaddeventListener
método o a través de los eventos tradicionales métodos de registro comoonclick
.this
directamente dentro de la propiedad de evento (como<button onclick="...this..." >
) del elemento, se refiere al elemento.this
indirectamente a través de otra función llamada dentro de la gestión de eventos de la función o evento de la propiedad se resuelve en el objeto globalwindow
.attachEvent
. En lugar de asignar la función al controlador de eventos (y por lo tanto, haciendo que el método de función del elemento), se llama a la función en el evento (efectivamente llamando en el contexto global).Recomiendo mejor probar esto en JSFiddle.
8.
this
en ES6 función de flechaEn una función de flecha,
this
se comportan como variables comunes: será heredada de su ámbito léxico. La función delthis
, donde la flecha función está definida, será la flecha de la funciónthis
.Así, que el mismo comportamiento como:
Ver el código siguiente:
this
no se establece la llamada. Puesto que el código no es en modo estricto, el valor dethis
debe ser siempre un objeto de modo que el valor predeterminado es el objeto global. Y de hecho es por eso que yo pensaba que directamente puede realizar llamada dewindow.f1()
, lo que significa quef1()
ya está conectado awindow
objeto, quiero decir antes de la invocación. Estoy equivocando?window.fn
, que no lo es. esto valor por defecto el objeto global porque no hay base de referencia se utiliza en la llamada, no porque de donde la función está definida (por lo que esto está todavía por cómo se llama a la función). Si usted llamar explícitamente utilizandowindow.fn
, entonces usted es la configuración de esto de la ventana. Mismo resultado, diferente manera de ir sobre él. 🙂var context = "global"; var obj = { context: "object", method: function () { function f() { var context = "function"; return this + ":" +this.context; }; return f(); //invoked without context } }; document.write(obj.method()); //[object Window]:global
Aquí lo que no se invoca sin contexto significa?Javascript
this
Simple invocación de función
Considere la siguiente función:
Nota que estamos ejecutando este en el modo normal, es decir, el modo estricto no se utiliza.
Cuando se ejecuta en un navegador, el valor de
this
sería registra comowindow
. Esto es debido a quewindow
es la variable global en un navegador web de su ámbito.Si ejecuta este mismo fragmento de código en un entorno como el de node.js,
this
haría referencia a la variable global en su aplicación.Ahora si ejecutamos este en modo estricto por la adición de la declaración de
"use strict";
a los principios de la declaración de la función,this
ya no se refieren a la variable global en cualquiera de los entornos. Esto se hace para evitar confusiones en modo estricto.this
sería, en este caso sólo tienes que entrarundefined
, porque eso es lo que es, no está definido.En los siguientes casos, podríamos ver cómo manipular el valor de
this
.Llamar a una función en un objeto
Hay diferentes maneras de hacer esto. Si han llamado a los métodos nativos en Javascript como
forEach
yslice
, usted ya debe saber que elthis
variable en ese caso se refiere a laObject
en el que se llama a esa función (tenga en cuenta que javascript, casi todo es unObject
, incluyendoArray
s yFunction
s). Usa el siguiente código de ejemplo.Si un
Object
contiene una propiedad que tiene unaFunction
, la propiedad es llamada a un método. Este método, cuando se llama, siempre esthis
conjunto de variables para laObject
la que está asociada. Esto es cierto tanto para el estricto y no estricto modos.Tenga en cuenta que si un método es almacenada (o más bien, copiado) en otra variable, la referencia a
this
es que ya no se conservan en la nueva variable. Por ejemplo:Considerando más comúnmente escenario de práctica:
La
new
palabra claveConsiderar un constructor de la función en Javascript:
¿Cómo funciona esto? Bien, vamos a ver lo que ocurre cuando se utiliza el
new
palabra clave.new
palabra clave inmediatamente inicializar unObject
de tipoPerson
.Object
tiene su constructor establece enPerson
. También, tenga en cuenta quetypeof awal
volveríaObject
sólo.Object
se le asigna el prototipo dePerson.prototype
. Esto significa que cualquier método o propiedad en laPerson
prototipo estaría disponible para todas las instancias dePerson
, incluyendoawal
.Person
en sí es ahora invoca;this
ser una referencia a la recién construida objetoawal
.Bastante sencillo, ¿eh?
Tenga en cuenta que el oficial de la especificación ECMAScript ningún lugar de los estados que tales tipos de funciones reales
constructor
funciones. Ellos son sólo funciones normales, ynew
puede ser utilizado en cualquier función. Es sólo que usamos como tal, y por eso las llamamos como tal sólo.Funciones de llamada Funciones:
call
yapply
Así que sí, ya que
function
s también sonObjects
(y en el hecho primero de la clase de variables en Javascript), incluso las funciones de disponer de métodos que son… bueno, funciones propias.Todas las funciones heredan de la global
Function
, y dos de sus muchos métodos soncall
yapply
, y ambos pueden ser usados para manipular el valor dethis
en la función en la que están llamados.Este es un ejemplo típico de uso de
call
. Básicamente, tiene el primer parámetro y establecethis
en la funciónfoo
como una referencia athisArg
. Todos los demás parámetros que se pasan acall
se pasa a la funciónfoo
como argumentos.Por lo que el código anterior registro de
{myObj: "is cool"}, [1, 2, 3]
en la consola. Muy buena forma de cambiar el valor dethis
en cualquier función.apply
es casi el mismo comocall
aceptar que sólo toma dos parámetros:thisArg
y una matriz que contiene los argumentos que se pasan a la función. Por lo que la anteriorcall
llamada puede ser traducido aapply
como este:Nota que
call
yapply
puede reemplazar el valor dethis
establecidas por el dot de invocación de método que hemos discutido en la segunda viñeta.Bastante Simple 🙂
Presentación….
bind
!bind
es un hermano decall
yapply
. También es un método heredado por todas las funciones desde el mundialFunction
constructor en Javascript. La diferencia entrebind
ycall
/apply
es que tantocall
yapply
realmente invocar la función.bind
, por el contrario, devuelve una nueva función con lathisArg
yarguments
pre-establecido. Veamos un ejemplo para entender mejor este:Ver la diferencia entre los tres? Es sutil, pero se utilizan de manera diferente. Como
call
yapply
,bind
también superan el valor dethis
establecidas por el dot-la invocación del método.También tenga en cuenta que ninguna de estas tres funciones de hacer cualquier cambio en la función original.
call
yapply
devuelve el valor de los recién construido, mientras que las funcionesbind
devolverá el recién construido función de sí mismo, listo para ser llamado.Cosas extras, copia este
A veces, no le gusta el hecho de que
this
cambios con el alcance, especialmente anidada alcance. Echa un vistazo al siguiente ejemplo.En el código anterior, podemos ver que el valor de
this
cambiado con el anidado de alcance, pero queríamos que el valor dethis
en el ámbito original. Así que ‘copiar’this
athat
y utiliza la copia en lugar dethis
. Inteligente, ¿eh?Índice:
this
por defecto?new
palabra clave?this
concall
yapply
?bind
.this
para resolver nested-cuestiones de ámbito.new
palabra clave? También esta pregunta ha sido vencer a la muerte, pero todos tenemos «que el tiempo nos trató de montar los faldones de la levita de una pregunta respondida hace 4 años»«esto» es todo acerca de alcance. Cada función tiene su propio ámbito, y puesto que todo en JS es un objeto, incluso una función puede almacenar valores en sí mismo usando el «este». La programación orientada a objetos 101 enseña que «esto» sólo es aplicable a instancias de un objeto. Por lo tanto, cada vez se ejecuta una función, una nueva «instancia» de que la función tiene un nuevo significado de «este».
La mayoría de la gente se confunde cuando intenta utilizar «this» dentro de anónimo cierre funciones como:
Así que aquí, en el interior de cada uno ()», este» no es el «valor» que se espera (de
por encima de él). Así, para obtener más de esta (ningún retruécano previsto) problema, un desarrollador podría:
Probarlo; te empiezan a gustar este patrón de programación
this
palabra clave no tiene nada que ver con el ámbito. También, tiene un significado también en funciones que no son propiedades de los objetos.this
no es TODO sobre el ámbito de aplicación. Es TODO acerca de la ejecución de contexto, que no es lo mismo como ámbito de aplicación. JavaScript es léxicamente ámbito (significado alcance está determinado por la ubicación del código), perothis
está determinado por la función que contiene se invoca – no se donde que la función es.this
en JavaScript se refiere siempre a la «dueño» de la función que se ser ejecutado.Si no explícito del propietario se define, entonces, la parte superior de la mayoría de propietario, el objeto de la ventana, se hace referencia.
Por lo que si hice
element.onclick = someKindOfFunction;
this
haría referencia al elemento objeto. Pero cuidado, muchas personas cometen este error.<element onclick="someKindOfFunction()">
En el último caso, usted se limita a hacer referencia a la función, no la mano sobre el elemento. Por lo tanto,
this
hará referencia al objeto window.Ya que este hilo se ha topado, he recopilado algunos de los puntos para los lectores nuevos a
this
tema.¿Cómo es el valor de
this
determinado?Utilizamos esta similar a la manera en que usamos los pronombres en los lenguajes naturales, como el inglés: «Juan está corriendo más rápido porque él está tratando de coger el tren.» En su lugar se podría haber escrito «… Juan está tratando de coger el tren».
this
no se le asigna un valor hasta que un objeto se invoca la función donde está definido. En el ámbito global, todas las variables globales y funciones están definidas en elwindow
objeto. Por lo tanto,this
en una función global se refiere (y tiene el valor de) el globalwindow
objeto.Cuando
use strict
,this
en global y en funciones anónimas que no están ligados a ningún objeto tiene un valor deundefined
.La
this
palabra clave es la mayoría de los incomprendidos cuando: 1) tomamos prestado un método que utilizathis
, 2) se le asigna un método que utilizathis
a una variable, 3) una función que utilizathis
se pasa como una función de devolución de llamada, y 4)this
se utiliza dentro de un cierre — interior de la función. (2)Qué le depara el futuro
Definido en ECMA Script 6, flecha-funciones de adoptar la
this
vinculante a partir de laadjuntando (función o global) ámbito de aplicación.
Mientras flecha-funciones de proporcionar una alternativa al uso de
bind()
, es importante tener en cuenta que ellos son esencialmente la desactivación de la tradicionalthis
mecanismo en favor de los más ampliamente entendido léxico de alcance. (1)Referencias:
Cada
funciónel contexto de ejecución en javascript tiene unalcancecontextoeste parámetro que se establece por:Cualquier cosa que alcance contexto, se hace referencia a «este».Puede
cambio de queestablece el valor de estealcancecontextoel uso defunc.call
,func.apply
ofunc.bind
.Por defecto, y lo que confunde a la mayoría de los principiantes, cuando un
devolución de llamadaoyente se llama después de que un evento se produce en un elemento de DOM, elalcance de contextoeste valor de la función es el elemento DOM.jQuery hace que este trivial cambiar con jQuery.proxy.
this
en Javascript es que no una propiedad intrínseca de la función en sí, sino más bien un artefacto de la forma en que se invoca la función.func.call
,func.bind
etc. – Sushilthis
no no de referencia en el ámbito de una función.this
hará referencia a un objeto específico (o posiblementeundefined
), que como hemos dicho puede ser cambiado usando.call()
o.apply()
. Una función de alcance es (esencialmente, cuando simplificado) de las variables que se tiene acceso, y esto depende enteramente donde la función es declarada y no puede ser cambiado.this
y ámbito de aplicación no tienen nada que ver el uno con el otro en ES5 y antes (por ejemplo, cuando esta respuesta fue escrito). En ES2015 (aka ES6),this
y ámbito de aplicación son las relacionadas con la un bastante mínimo manera wrt flecha funciones (lathis
en una flecha función es heredada de su ámbito envolvente), perothis
nunca se refiere a un ámbito.Aquí es una buena fuente de
this
enJavaScript
.Aquí está el resumen:
global de este
En un navegador, en el ámbito global,
this
es elwindow
objetoEn
node
el uso de la repl,this
es la parte superior del espacio de nombres. Puede referirse a él comoglobal
.En
node
la ejecución de un script,this
en el ámbito global, se inicia como un objeto vacío. No es lo mismo comoglobal
función de este
Excepto en el caso de DOM controladores de eventos o cuando un
thisArg
es proporcionada (ver más abajo), tanto en el nodo y en un explorador conthis
en una función que no es llamado connew
referencias en el ámbito global…Si utiliza
use strict;
, en cuyo casothis
seráundefined
Si se llama a una función con
new
lathis
será un nuevo contexto, no de referencia mundialthis
.Funciones de crear convertido en objetos de función. Se obtiene automáticamente una especial
prototype
de la propiedad, que es algo que usted puede asignar valores. Cuando se crea una instancia por llamar a la función connew
usted consigue el acceso a los valores que se asignan a laprototype
de la propiedad. Usted tiene acceso a esos valores mediantethis
.Suele ser un error asignar matrices o objetos en el
prototype
. Si desea que las instancias que tienen cada uno sus propias matrices, cree en la función, no el prototipo.Puede utilizar
this
en cualquier función de un objeto para hacer referencia a otras propiedades de ese objeto. Este no es el mismo como una instancia creada connew
.En un HTML DOM controlador de eventos,
this
es siempre una referencia al elemento DOM en el evento se adjunta aA menos que usted
bind
el contextoDentro de los atributos de HTML en el que usted puede poner JavaScript,
this
es una referencia al elemento.Puede utilizar
eval
para acceder athis
.Puede utilizar
with
para agregarthis
a la actual alcance a leer y escribir a los valoresthis
sin hacer referencia athis
explícitamente.de jQuery en muchos lugares se han
this
se refieren a un elemento de DOM.Daniel, impresionante explicación! Un par de palabras sobre este y una buena lista de
this
contexto de ejecución puntero en el caso de los controladores de eventos.En dos palabras,
this
en JavaScript puntos el objeto de quién (o de cuyo contexto de ejecución) de la función se ejecute, y siempre es de sólo lectura, no se puede establecer de todos modos (por ejemplo un intento de acabar con ‘Invalid lado izquierdo de la asignación de un mensaje.Para los controladores de eventos: en línea de controladores de eventos, tales como
<element onclick="foo">
, con exclusión de cualquier otro controladores de los adjuntos anterior y antes, así que tenga cuidado y que es mejor mantenerse fuera de eventos en línea delegación en absoluto.Y gracias a Zara Alaverdyan que me inspiró a esta lista de ejemplos a través de un disidente debate 🙂
el.onclick = foo; //in the foo - obj
el.onclick = function () {this.style.color = '#fff';} //obj
el.onclick = function() {doSomething();} //In the doSomething -
Window
el.addEventListener('click',foo,false) //in the foo - obj
el.attachEvent('onclick, function () { //this }') //window, all the
compliance to IE :)
<button onclick="this.style.color = '#fff';"> //obj
<button onclick="foo"> //In the foo - window, but you can <button
onclick="foo(this)">
Hay mucha confusión con respecto a cómo «este» palabra clave es interpretado en JavaScript. Esperemos que este artículo va a sentar a todos aquellos a descansar de una vez por todas. Y un montón más. Por favor leer todo el artículo con cuidado. Ten en cuenta que este artículo es largo.
Con independencia del contexto en el que se utiliza, «este» siempre hace referencia a la «objeto actual» en Javascript. Sin embargo, lo que el «objeto actual» se difiere según contexto. El contexto puede ser exactamente 1 de los 6 siguientes:
Continuación se describe cada uno de estos contextos, uno por uno:
Contexto Global (es decir, Fuera de todas las funciones):
Fuera de todas las funciones (es decir, en el contexto global) el «actual
objeto» (y por lo tanto el valor de «este») es siempre el
«ventana» objeto para navegadores.
Dentro Directa «No Vinculado A La Función» Llamada:
Dentro de un Directo «No Vinculado a la Función» Llamada, el objeto de que
invoca la llamada a la función se convierte en el «objeto actual» (y por lo tanto
el valor de «este»). Si se llama a una función sin un explícito objeto actual, el objeto actual es el «ventana» objeto (No en Modo Estricto) o indefinido (Para el Modo Estricto) . Cualquier función (o variable), definido en el
Contexto Global automáticamente se convierte en una propiedad de la «ventana» objeto.Para el correo.g Supongamos que la función se define en el Contexto Global como
se convierte en la propiedad del objeto window, como si se han definido
como
En «No de Modo Estricto», Llamando/Invocar esta función directamente a través de «UserDefinedFunction()» llamar automáticamente a/invoke
como «de la ventana.UserDefinedFunction()» hacer «ventana» como el
«objeto actual» (y por lo tanto el valor de «este») dentro de «UserDefinedFunction».La invocación de esta función en «No de Modo Estricto» se producirá en el siguiente
En «Modo Estricto», Llamando/Invocando a la función directamente a través de
«UserDefinedFunction()» se «NO» automáticamente de llamar o invocar como «de la ventana.UserDefinedFunction()».De ahí el «actual
objeto» (y el valor de «este») dentro de
«UserDefinedFunction» será indefinido. La invocación de esta función en «Modo Estricto» se producirá en el siguiente
Sin embargo, invocando explícitamente el uso de la ventana de objeto tendrá como resultado
el siguiente
Veamos otro ejemplo. Por favor mira el siguiente código
En el ejemplo anterior, podemos ver que cuando «UserDefinedFunction» fue
invoca a través de o1, «este» toma el valor de o1 y la
el valor de sus propiedades «a» y «b» obtener muestra. El valor
de «c» y «d» se muestra como indefinido como o1 ¿
no definir estas propiedades
De manera similar cuando se «UserDefinedFunction» se invocan a través de o2,
«este» toma el valor de o2 y el valor de sus propiedades «c» y «d» obtener muestra.El valor de «a» y «b» se muestra como indefinido como o2 no definir estas propiedades.
Dentro Indirecta «No Vinculado a la Función» Llamada a través de functionName.llame y functionName.aplicar:
Cuando un «No Vinculado a la Función» se llama a través de
functionName.llame o functionName.aplicar, el «objeto actual» (y por lo tanto el valor de «este») se establece en el valor de
«este» parámetro (primer parámetro) pasó a de llamada y aplicar. El código siguiente muestra el mismo.
El código anterior muestra claramente que el «este» valor «NO
Vinculado a la Función» puede ser alterada a través de la de llamada y aplicar. También,si el
«este» parámetro no está explícitamente pasa a de llamada y aplicar, «objeto actual» (y por lo tanto el valor de «este») se establece en «ventana» No de modo estricto y «undefined» en modo estricto.
En el interior «, Vinculados a la Función» Llamada (es decir, una función que ha sido obligado por llamar functionName.se unen):
Una función es una función cuyo «este» valor ha sido
fijo. El código siguiente se demuestra cómo «este» obras en caso de que
de obligado función
Como se indica en el código de arriba, «este» valor para cualquiera «, Vinculados a la Función»
NO puede ser alterada a través de la llamada/aplicar. También, si el «este»
parámetro no está explícitamente pasa a enlazar, «objeto actual»
(y, por tanto, el valor de «este» ) se establece para «ventana» en No
de modo estricto y «undefined» en modo estricto. Una cosa más.
La unión de una ya obligado de la función no cambia el valor de «este».
Queda definido como el valor establecido por primera función de enlace.
Mientras que la Creación de Objetos a través de la «nueva»:
Dentro de una función constructora de la «objeto actual» (y, por tanto, el valor de
«este») hace referencia al objeto que está siendo creado
a través de «nuevo» independientemente del estado de enlace de la función. Sin embargo
si el constructor es una función que será llamada con
conjunto predefinido de argumentos como para establecer el límite de la función.
Interior en línea DOM controlador de eventos:
Por favor mira el siguiente Fragmento de código HTML
La «este» en los ejemplos anteriores se refieren a «botón» elemento y el
«div» elemento respectivamente.
En el primer ejemplo, el color de la fuente del botón se ajustará a la
blanco cuando se hace clic en él.
En el segundo ejemplo, cuando el «div» elemento se hace clic en él se
llame a la OnDivClick función con su segundo parámetro
hace referencia al hecho clic elemento div. Sin embargo, el valor de «este»
dentro de OnDivClick NO referencia el hecho clic div
elemento. Será establecido como el la ventana de»objeto» o
«undefined» en No estricta y Estricto Modos de respectivamente (si OnDivClick es un independiente de la función) o ajustada a un predefinidos
Valor del límite (si OnDivClick es un obligado función)
La siguiente resume el artículo completo
En el Contexto Global «este» se refiere siempre a la «ventana» objeto
Cuando una función se invoca, se invoca en el contexto de un
objeto («objeto actual»). Si el objeto actual no está expresamente previsto,
el objeto actual es el la ventana de»objeto» en NO Estrictos
Modo de y «undefined» en Modo Estricto por defecto.
El valor de «este» dentro de un No Obligado función es la referencia al objeto en el contexto de la cual se invoca la función («objeto actual»)
El valor de «este» dentro de un No Obligado función puede ser anulada por
llamada y aplicar métodos de la función.
El valor de «este» es fijo para una función y no puede ser
anulada por llamada y aplicar métodos de la función.
De unión y ya obligado de la función no cambia el valor de «este». Queda definido como el valor establecido por primera función de enlace.
El valor de «este» dentro de un constructor es el objeto que se está
crea e inicializa
El valor de «este» dentro de una línea de DOM controlador de eventos es de referencia
para el elemento para el que el controlador de eventos es dado.
Probablemente el más detallado y completo artículo sobre
this
es la siguiente:Suave explicación de ‘esta’ palabra clave ‘ en JavaScript
La idea detrás de
this
es entender que la invocación de la función de los tipos tienen la importancia significativa en la configuración dethis
valor.Cuando teniendo problemas en la identificación de
this
, no pregúntate a ti mismo:pero hacer pregúntate a ti mismo:
Para una función de flecha (caso especial de un contexto de transparencia) pregúntate a ti mismo:
Esta forma de pensar es correcta cuando se trata con
this
y te ahorrará dolores de cabeza.this
palabra clave?Esta es la mejor explicación que he visto: Entender JavaScripts este con Claridad
Hay Cuatro Escenarios donde este puede ser confuso:
Él da ejemplos de código, explicaciones y soluciones, lo cual me pareció muy útil.
Es difícil obtener una buena comprensión de la JS, o escribir más que nada trivial en ella, si no la comprende. Usted simplemente no puede permitirse el lujo de tomar una inmersión rápida 🙂 creo que la mejor manera de empezar con el JS es primero ver estos video conferencias por Douglas Crockford – http://yuiblog.com/crockford/, que cubre esto y aquello, y todo lo demás acerca de JS.
En pseudoclassical términos, la forma en que muchos de conferencias enseñar a los ‘esta’ palabra clave ‘ es como un objeto instanciado por un objeto o clase de constructor. Cada vez que un nuevo objeto se construye a partir de una clase, imaginar que bajo el capó de una instancia local de un ‘este’ objeto se crea y se devuelve. Recuerdo que enseña como este:
this
es uno de los mal entendido concepto en JavaScript ya que se comporta de manera diferente de un lugar a otro. Simplemente,this
se refiere a la «propietario» de la función que se están ejecutando actualmente.this
ayuda a obtener el objeto actual (un.k.una. contexto de ejecución) con los que trabajamos. Si usted entiende en la que el objeto de la función actual es conseguir que se ejecuta, puede entender fácilmente lo actualthis
esAnterior, podemos crear 3 variables con el mismo nombre de ‘val’. Uno en el contexto global, uno de ellos dentro de obj y el otro en el interior de innerMethod de obj. JavaScript resuelve identificadores dentro de un contexto determinado por subir el ámbito de la cadena de locales a globales.
Pocos lugares donde
this
pueden ser diferenciadosLlamar a un método de un objeto
Cuando line1 se ejecuta, JavaScript, que establece un contexto de ejecución (CE) para la llamada a la función, la configuración de
this
a la objeto referenciado por lo que sucedió antes de que el último «.». así, en la última línea se puede entender quea()
fue ejecutado en el contexto global que es elwindow
.Con Constructor
this
puede ser usado para referirse al objeto que está siendo creadoCuando los nuevos
Person()
se ejecuta, un nuevo objeto es creado.Person
se llama y suthis
se establece en referencia a ese nuevo objeto.Llamada a la función
Si perdemos
new
palabra clave,whatIsThis
se refiere a la mayoría de contexto global se puede encontrar(window
)Con los controladores de eventos
Si el controlador de eventos es en línea,
this
se refiere al objeto globalCuando la adición de controlador de eventos a través de JavaScript,
this
se refiere al elemento DOM que ha generado el evento..apply()
.call()
y.bind()
var = este
significa en JavaScriptEl valor de «esto» depende del «contexto» en que se ejecuta la función. El contexto puede ser cualquier objeto o el objeto global, es decir, la ventana.
Por lo que la Semántica de «este» es diferente de los tradicionales lenguajes de programación orientada a objetos. Y causa problemas:
1. cuando una función se pasa a otra variable (lo más probable, una devolución de llamada); y 2. cuando el cierre se invoca desde un método de miembro de una clase.
En ambos casos, se establece en la ventana.
Whould este ayuda? (La mayoría de la confusión de ‘esta’ en javascript que viene del hecho de que generalmente no está vinculada a su objeto, sino a la actual ejecución de alcance-que pueden no ser exactamente cómo funciona, pero siempre se siente como que para mí, ver el artículo para una explicación completa)
Un poco de info acerca de este palabra clave
Vamos a iniciar sesión
this
palabra clave para la consola en el ámbito global, sin más código, peroEn Cliente/Navegador
this
de palabras clave es un objeto global que eswindow
y
En Servidor/Node/tiempo de ejecución de Javascript
this
palabra clave es también un objeto global que esmodule.exports
Tenga en cuenta
exports
es sólo una referencia amodule.exports
este uso para el Ámbito como este
valor de txt1 y txt es el mismo
en el ejemplo de Arriba
$(this)=$(‘#tbleName tbody tr’) es el Mismo
Tengo una opinión diferente sobre la
this
de las otras respuestas que espero que sea de ayuda.Una manera de ver el JavaScript para ver que solo hay 1 forma de llamar a una función1. Es
Siempre hay algún valor proporcionado para
objectForThis
.Todo lo demás es azúcar sintáctico para
functionObject.call
Así, todo lo demás puede ser descrito por la forma en que se traduce en
functionObject.call
.Si usted acaba de llamar a una función, a continuación,
this
es el «objeto global», que en el navegador es la ventanaJS:
En otras palabras,
se tradujo en
Tenga en cuenta que si utiliza el modo estricto, a continuación,
this
seráundefined
JS:
que significa
En otras palabras,
se tradujo en
En JavaScript hay operadores como
+
y-
y*
. También existe el operador punto que es.
La
.
operador cuando se utiliza con una función en el derecho y un objeto a la izquierda significa «pasar de objeto comothis
a la función.Ejemplo
JS:
En otras palabras
bar.foo()
se traduce enconst temp = bar.foo; temp.call(bar);
Tenga en cuenta que no importa cómo la función fue creado (la mayoría…). Todos estos se producen los mismos resultados
JS:
De nuevo todos estos son sólo azúcar sintáctico para
Otra arruga es el prototipo de la cadena. Cuando se utiliza
a.b
JavaScript busca primero en el objeto al que hace referencia directamente pora
de la propiedadb
. Sib
no se encuentra en el objeto, a continuación, JavaScript mirada en el objeto prototipo de encontrarb
.Hay diferentes maneras de definir un objeto prototipo, el más común en 2019 es el
class
palabra clave. Para los fines dethis
aunque no importa. Lo que importa es que como se ve en el objetoa
de propiedadb
si encuentra la propiedadb
en el objeto o en la cadena de prototipos sib
termina siendo una función, a continuación, las mismas reglas aplican. La funciónb
referencias se llama mediante lacall
método y pasandoa
como objectForThis como se muestra la parte superior de esta respuesta.Ahora. Vamos a hacer una función que establece explícitamente
this
antes de llamar a otra función y, a continuación, llame a con los.
(dot) operadorJS:
Después de la traducción para el uso
call
,obj.bar()
se convierte enconst temp = obj.bar; temp.call(obj);
. Cuando entramos en labar
función llamamosfoo
pero de forma explícita que pasa en otro objeto para objectForThis así que cuando llegamos a foothis
es que el objeto interno.Esto es lo que tanto
bind
y=>
funciones con eficacia. Son más azúcar sintáctico. Efectivamente construir una nueva función invisible exactamente comobar
arriba que se establece explícitamentethis
antes de que llame a cualquier función que se especifica. En el caso de bindthis
se establece a lo que sea que pase abind
.JS:
Tenga en cuenta que si
functionObject.bind
no existiera, podríamos hacer nuestra propia como estey, a continuación, que podríamos llamar como este
Flecha funciones, la
=>
operador azúcar sintáctico para enlazares el mismo que
Igual
bind
, una nueva función invisible se crea que llama a la función dada con un valor de límite paraobjectForThis
pero a diferencia debind
el objeto enlazado es implícita. Es lo quethis
sucede cuando el=>
operador se utiliza.Por lo tanto, como las reglas de arriba
obj.foo()
se traduce enconst temp = obj.foo; temp.call(obj);
lo que significa que el operador flecha en el interior defoo
se unenobj
a una nueva invisible de la función y el rendimiento que de nuevo invisible de la función que se asigna ab
.b()
va a trabajar como siempre lo ha hecho comob.call(window)
ob.call(undefined)
llamar a la nueva función invisible quefoo
creado. Que función invisible ignora lathis
pasa y pasaobj
como objectForThis` para la función de flecha.El código anterior se traduce en
1
apply
otra función es similar a lacall
Pero como de ES6 conceptualmente incluso se puede traducir que en
Resumen
this
Javascript:this
está determinado por cómo se invoca la función no se, en donde fue creada!this
es determinado por el Objeto que está a la izquierda del punto. (window
en el espacio global)this
se refiere al elemento DOM en el cual el evento fue llamado.new
palabra clave el valor dethis
hace referencia al objeto recién creadothis
con las funciones de:call
,apply
,bind
Ejemplo:
JS:
Detectores de eventos de ejemplo:
JS:
CSS:
HTML:
Ejemplo constructor:
JS:
Respuesta es Simple:
palabra»this» es siempre la persona a cargo en el contexto de la invocación. Ellos se mencionan a continuación.
SE LLAMA A LA FUNCIÓN CON LA PALABRA CLAVE NEW
Si se llama a la función con la palabra clave NEW, a continuación, ESTE estará obligado al objeto recién creado.
En el anterior, este estará obligado a ‘myCar’ objeto
SE LLAMA A LA FUNCIÓN EXPLÍCITAMENTE EL USO DE LA LLAMADA Y LA APLICACIÓN DE MÉTODOS.
En este caso, se enlazará con el objeto de que explícitamente se pasa a la función.
SI SE LLAMA A LA FUNCIÓN CON OBJETO DE FORMA IMPLÍCITA, A CONTINUACIÓN, ESTE ESTARÁ OBLIGADO A ESE OBJETO
CUANDO SE LLAMA A LA FUNCIÓN SIN NINGÚN TIPO DE CONTEXTO, A CONTINUACIÓN, ESTE ESTARÁ OBLIGADO A OBJETO GLOBAL
EN MODO ESTRICTO, ESTE SERÁ INDEFINIDO