Cuando se crea una función, una palabra clave llamada esta
se crea (detrás de escena), que enlaza con el objeto en el que opera la función. Dicho de otra manera, esta
está disponible para el alcance de su función, pero es una referencia al objeto del cual esa función es una propiedad o método..
Echemos un vistazo a la cody
Objeto de un artículo anterior:
Muestra: sample98.html
Observe cómo dentro de la getGender
función, estamos accediendo a la género
propiedad usando notación de puntos (cody.gender
) sobre el cody
objeto en sí mismo. Esto puede ser reescrito usando esta
para acceder a la cody
objeto porque esta
apunta a la cody
objeto.
Muestra: sample99.html
los esta
utilizado en esto.
simplemente se refiere al objeto cody en el que opera la función.
El tema de esta
Puede ser confuso, pero no tiene por qué serlo. Solo recuerda que en general, esta
se usa dentro de las funciones para referirse al objeto dentro del cual está contenida la función, a diferencia de la función en sí misma (las excepciones incluyen el uso de nuevo
palabra clave o llamada()
y aplicar()
).
La palabra clave esta
se ve y actúa como cualquier otra variable, excepto que no puedes modificarla.
Opuesto a argumentos
y cualquier parámetro enviado a la función., esta
es una palabra clave (no una propiedad) en el objeto de llamada / activación.
esta
Determinado?El valor de esta
, Pasado a todas las funciones, se basa en el contexto en el que se llama a la función en tiempo de ejecución. Preste atención aquí, porque esta es una de esas peculiaridades que solo necesita memorizar.
los miObjeto
El objeto en el siguiente ejemplo de código recibe una propiedad llamada sayFoo, que apunta a la decirFoo
función. Cuando el decirFoo
La función se llama desde el ámbito global., esta
se refiere a ventana
objeto. Cuando se llama como un método de myObject, esta
se refiere a miObjeto
.
Ya que miObjeto
tiene una propiedad llamada foo
, esa propiedad es usada.
Muestra: sample100.html
Claramente, el valor de esta
se basa en el contexto en el que se llama la función. Considera que ambos myObject.sayFoo
y decirFoo
apuntar a la misma función. Sin embargo, dependiendo de donde (el contexto) sayFoo ()
se llama desde, el valor de esta
es diferente.
Si ayuda, aquí está el mismo código con el objeto head (ventana
) utilizado explícitamente.
Muestra: sample101.html
Asegúrese de que al pasar por las funciones, o tener múltiples referencias a una función, se dé cuenta de que el valor de esto cambiará dependiendo del contexto en el que llame a la función..
Todas las variables excepto esta
y argumentos
seguir el alcance léxico
esta
La palabra clave se refiere al objeto principal en funciones anidadasQuizás te preguntes qué pasa con esta
cuando se usa dentro de una función que está contenida dentro de otra función. La mala noticia está en ECMA 3., esta
pierde su camino y se refiere al objeto cabeza (el ventana
objeto en los navegadores), en lugar del objeto dentro del cual se define la función.
En el siguiente código, esta
dentro de func2
y func3
pierde su camino y no se refiere a miObjeto
pero en cambio al objeto cabeza.
Muestra: sample102.html
La buena noticia es que esto se solucionará en ECMAScript 5. Por ahora, debe tener en cuenta este problema, especialmente cuando comienza a pasar funciones como valores a otras funciones..
Considere la siguiente muestra y lo que sucede cuando se pasa una función anónima a foo.func1
. Cuando la función anónima se llama dentro de foo.func1
(una función dentro de una función), la esta
El valor dentro de la función anónima será una referencia al objeto principal..
Muestra: sample103.html
Ahora nunca olvidarás: el esta
el valor siempre será una referencia al objeto principal cuando su función de host se encapsula dentro de otra función o se invoca dentro del contexto de otra función (de nuevo, esto se corrige en ECMAScript 5).
De manera que la esta
El valor no se pierde, simplemente puede usar la cadena de alcance para mantener una referencia a esta
en la función padre. El siguiente ejemplo muestra cómo, usando una variable llamada ese
, y aprovechando su alcance, podemos hacer un mejor seguimiento del contexto de la función.
Muestra: sample104.html
esta
Utilizando llamada()
o aplicar()
El valor de esta
normalmente se determina a partir del contexto en el que se llama a una función (excepto cuando la nueva palabra clave se usa más sobre eso en un minuto), pero puede sobrescribir y controlar el valor de esta
utilizando aplicar()
o llamada()
para definir que objeto esta
Apunta al invocar una función. Usar estos métodos es como decir: "Oye, llama a la función X pero dile a la función que use el objeto Z como el valor para esta
."Al hacerlo, la forma predeterminada en la que JavaScript determina el valor de esta
está anulado.
En la siguiente muestra, creamos un objeto y una función. Entonces invocamos la función a través de llamada()
para que el valor de esta
Dentro de la función usa. miObjeto
como su contexto. Las declaraciones dentro del mi función
la función se rellenará miObjeto
con propiedades en lugar de poblar el objeto cabeza. Hemos alterado el objeto al cual esta
(dentro de mi función
) se refiere.
Muestra: sample105.html
En el ejemplo anterior, usamos llamada()
, pero aplicar()
podría ser utilizado también. La diferencia entre los dos es cómo se pasan los parámetros para la función. Utilizando llamada()
, Los parámetros son solo valores separados por comas. Utilizando aplicar()
, los valores de los parámetros se pasan dentro de una matriz como se muestra en el siguiente ejemplo.
Muestra: sample106.html
Lo que debe aprender aquí es que puede anular la forma predeterminada en la que JavaScript determina el valor de esta
en el alcance de una función.
esta
Palabra clave dentro de una función constructora definida por el usuarioCuando se invoca una función con el nuevo
palabra clave, el valor de esta
como se indica en el constructor se refiere a la propia instancia. Dicho de otra manera: en la función de constructor, podemos aprovechar el objeto a través de esta
antes de que el objeto sea realmente creado. En este caso, el valor por defecto de esta
cambios de una manera similar al uso llamada()
o aplicar()
.
En el siguiente ejemplo, configuramos un Persona
función constructora que utiliza esta
para hacer referencia a un objeto que se está creando. Cuando una instancia de Persona
es creado, este nombre
hará referencia al objeto recién creado y colocará una propiedad llamada nombre en el nuevo objeto con un valor del parámetro (nombre
) Pasado a la función constructora..
Muestra: sample107.html
Otra vez, esta
se refiere al "objeto que será" cuando se invoca la función de constructor usando el nuevo
palabra clave. Si no hubiéramos usado el nuevo
palabra clave, el valor de esta
seria el contexto en el cual Persona
Se invoca - en este caso el objeto head. Examinemos el siguiente escenario:
Muestra: sample108.html
esta
Dentro de un método de prototipo se refiere a una instancia de constructorCuando se usa en funciones agregadas a un constructor. prototipo
propiedad, esta
se refiere a la instancia en la que se invoca el método. Digamos que tenemos una costumbre Persona()
Función constructora. Como parámetro, requiere el nombre completo de las personas. En caso de que necesitemos acceder al nombre completo de la persona, agregamos un whatIsMyFullName
método para el Person.prototype
para que todo Persona
Las instancias heredan el método. Cuando usas esta
, el método puede referirse a la instancia que lo invoca (y por lo tanto a sus propiedades).
Aquí os muestro la creación de dos. Persona
objetos (cody
y lisa
) y el heredado whatIsMyFullName
Método que contiene la palabra clave this para acceder a la instancia..
Muestra: sample109.html
El concepto para llevar aquí es ese
la palabra clave se usa para referirse a casos cuando se usa dentro de un método contenido en el prototipo
objeto. Si la instancia no contiene la propiedad, comienza la búsqueda del prototipo.
Si la instancia o el objeto señalado por esta
no contiene la propiedad a la que se hace referencia, se aplican las mismas reglas que se aplican a cualquier búsqueda de propiedad y la propiedad se "buscará" en la cadena de prototipos. Así que en nuestro ejemplo, si el nombre completo
propiedad no estaba contenida dentro de nuestra instancia, nombre completo
sería buscado en Person.prototype.fullName
, entonces Object.prototype.fullName
.