La palabra clave este

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.


Como es el valor de 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


los esta La palabra clave se refiere al objeto principal en funciones anidadas

Quizá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).


Trabajando alrededor del problema de la función anidada al aprovechar la cadena de alcance

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

 

Controlando el valor de 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.


Utilizando la esta Palabra clave dentro de una función constructora definida por el usuario

Cuando 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

 

La palabra clave esta Dentro de un método de prototipo se refiere a una instancia de constructor

Cuando 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

 

Conclusión

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.