En un archivo de JavaScript vi:
function Somefunction(){
var that = this;
...
}
¿Cuál es el propósito de declarar that
y asignarle this
esto?
javascript
this
Chris
fuente
fuente
Respuestas:
Voy a comenzar esta respuesta con una ilustración:
Mi respuesta originalmente demostró esto con jQuery, que es muy ligeramente diferente:
Debido a que con
this
frecuencia cambia cuando cambia el alcance llamando a una nueva función, no puede acceder al valor original al usarlo. Aliasing to lethat
permite todavía acceder al valor original dethis
.Personalmente, no me gusta el uso de
that
alias. Raramente es obvio a qué se refiere, especialmente si las funciones son más largas que un par de líneas. Yo siempre uso un alias más descriptivo. En mis ejemplos anteriores, probablemente usaríaclickedEl
.fuente
var self = this;
. La palabrathat
parece implicar que la variable es cualquier cosa PEROthis
.forEach
función toma un segundo argumento opcional que es el enlace de la función.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Por lo tanto, se debe agregar una nota que realmentevar that = this
no se necesita con .forEach
De Crockford
JS Fiddle
Esto alerta ...
fuente
that
variable no se usa en absoluto en su ejemplo. Hace que parezca que solo crear una retención variablethis
hace algo al resto del código.Este es un truco para hacer que las funciones internas (funciones definidas dentro de otras funciones) funcionen más como deberían. En javascript, cuando define una función dentro de otra
this
, se establece automáticamente en el ámbito global. Esto puede ser confuso porque esperathis
tener el mismo valor que en la función externa.Esto es específicamente un problema cuando crea una función como método de un objeto (como
car.start
en el ejemplo) y luego crea una función dentro de ese método (comoactivateStarter
). En el método de nivel superiorthis
apunta al objeto, es un método de (en este casocar
) pero en la función internathis
ahora apunta al alcance global. Esto es un dolorCrear una variable para usar por convención en ambos ámbitos es una solución para este problema muy general con JavaScript (aunque también es útil en las funciones de jquery). Es por eso que el nombre que suena muy general
that
se usa el . Es una convención fácilmente reconocible para superar una deficiencia en el idioma.Al igual que El Ronnoco insinúa que Douglas Crockford cree que es una buena idea.
fuente
El uso de
that
no es realmente necesario si realiza una solución alternativa con el uso decall()
oapply()
:fuente
A veces
this
puede referirse a otro ámbito y a otra cosa, por ejemplo, suponga que desea llamar a un método constructor dentro de un evento DOM, en este casothis
se referirá al elemento DOM, no al objeto creado.HTML
JS
Manifestación
La solución anterior voluntad assing
this
athat
continuación, podemos y acceso a la propiedad de nombre dentro de lasayHi
método dethat
, por lo que este puede ser llamado sin problemas dentro de la llamada DOM.Otra solución es asignar un
that
objeto vacío y agregarle propiedades y métodos y luego devolverlo. Pero con esta solución perdiste laprototype
del constructor.fuente
Aquí hay un ejemplo `
Por lo tanto, puede ver que el valor de esto es dos valores diferentes dependiendo del elemento DOM al que apunta, pero cuando agrega "eso" al código anterior, cambia el valor de "esto" al que apunta.
..... $ (that) .css ("color de fondo", "# ffe700"); // Aquí el valor de "that" es ".our-work-group> p> a" porque el valor de var that = this; así que aunque estemos en "this" = '.our-work-single-page', aún podemos usar "that" para manipular el elemento DOM anterior.
fuente