De los documentos , entiendo que .proxy()
cambiaría el alcance de la función pasada como argumento. ¿Podría alguien explicarme esto mejor? ¿Por qué deberíamos hacer ésto?
javascript
jquery
Aditya Shukla
fuente
fuente
Respuestas:
Lo que finalmente hace es garantizar que el valor de
this
una función sea el valor que desee.Un ejemplo común es el
setTimeout
que tiene lugar dentro de unclick
controlador.Toma esto:
La intención es lo suficientemente simple. Cuando
myElement
se hace clic, debería obtener la claseaNewClass
. Dentro del controladorthis
representa el elemento en el que se hizo clic.Pero, ¿y si quisiéramos un pequeño retraso antes de agregar la clase? Podríamos usar a
setTimeout
para lograrlo, pero el problema es que cualquiera que sea la función que le demossetTimeout
, el valor dethis
dentro de esa función será enwindow
lugar de nuestro elemento.Entonces, lo que podemos hacer es llamar
$.proxy()
, enviarle la función y el valor que queremos asignarthis
, y devolverá una función que retendrá ese valor.Entonces, después de que le dimos
$.proxy()
la función y el valor que deseamosthis
, devolvió una función que garantizará quethis
se establezca correctamente.Como lo hace Simplemente devuelve una función anónima que llama a nuestra función utilizando el
.apply()
método, que le permite establecer explícitamente el valor dethis
.Un aspecto simplificado de la función que se devuelve puede verse así:
Por lo tanto, se le asigna esta función anónima
setTimeout
y todo lo que hace es ejecutar nuestra función original con elthis
contexto adecuado .fuente
$.proxy(function () {...}, this)
lugar de(function() {...}).call(this)
? ¿Hay una diferencia?.call
usted está llamando a la función de inmediato. Con$.proxy
, es comoFunction.prototype.bind
donde devuelve una nueva función. Esa nueva función tiene elthis
valor enlazado permanentemente, de modo que cuando se pasasetTimeout
ysetTimeout
llama a la función más tarde, seguirá teniendo elthis
valor correcto .Sin entrar en mayor detalle (lo cual sería necesario porque se trata de Contexto en ECMAScript, la variable de contexto de este, etc.)
Hay tres tipos diferentes de "Contextos" en ECMA- / Javascript:
Cada código se ejecuta en su contexto de ejecución . Hay un contexto global y puede haber muchas instancias de contextos de función (y evaluación). Ahora la parte interesante:
Cada llamada de una función ingresa al contexto de ejecución de la función. El contexto de ejecución de una función se ve así:
El objeto de activación
Alcance encadena
este valor
Entonces, este valor es un objeto especial que está relacionado con el contexto de ejecución. Hay dos funciones en ECMA- / Javascript que pueden cambiar este valor en un contexto de ejecución de función:
Si tenemos una función
foobar()
, podemos cambiar este valor llamando a:Ahora podríamos acceder en
foobar
el objeto que pasamos:Esto es exactamente lo que
jQuery.proxy()
hace. Toma unfunction
ycontext
(que no es más que un objeto) y vincula la función invocando.call()
o.apply()
y devuelve esa nueva función.fuente
He escrito esta función:
fuente
Se puede lograr el mismo objetivo utilizando una
función de ejecución automática"Expresión de función invocada inmediatamente, abreviatura: IIFE" :fuente