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
thisuna función sea el valor que desee.Un ejemplo común es el
setTimeoutque tiene lugar dentro de unclickcontrolador.Toma esto:
La intención es lo suficientemente simple. Cuando
myElementse hace clic, debería obtener la claseaNewClass. Dentro del controladorthisrepresenta 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
setTimeoutpara lograrlo, pero el problema es que cualquiera que sea la función que le demossetTimeout, el valor dethisdentro de esa función será enwindowlugar 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á quethisse 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
setTimeouty todo lo que hace es ejecutar nuestra función original con elthiscontexto adecuado .fuente
$.proxy(function () {...}, this)lugar de(function() {...}).call(this)? ¿Hay una diferencia?.callusted está llamando a la función de inmediato. Con$.proxy, es comoFunction.prototype.binddonde devuelve una nueva función. Esa nueva función tiene elthisvalor enlazado permanentemente, de modo que cuando se pasasetTimeoutysetTimeoutllama a la función más tarde, seguirá teniendo elthisvalor 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
foobarel objeto que pasamos:Esto es exactamente lo que
jQuery.proxy()hace. Toma unfunctionycontext(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