D'après la documentation, je comprends que .proxy()
cela changerait la portée de la fonction passée en argument. Quelqu'un pourrait-il mieux m'expliquer cela? Pourquoi devrions-nous faire cela?
javascript
jquery
Aditya Shukla
la source
la source
Réponses:
En fin de compte, il garantit que la valeur d'
this
une fonction sera la valeur que vous désirez.Un exemple courant est
setTimeout
celui qui a lieu à l'intérieur d'unclick
gestionnaire.Prends ça:
L'intention est assez simple. Quand
myElement
est cliqué, il devrait obtenir la classeaNewClass
. À l'intérieur du gestionnairethis
représente l'élément sur lequel l'utilisateur a cliqué.Mais que faire si nous voulions un court délai avant d'ajouter la classe? Nous pourrions utiliser a
setTimeout
pour l'accomplir, mais le problème est que quelle que soit la fonction que nous attribuonssetTimeout
, la valeur de l'this
intérieur de cette fonction serawindow
au lieu de notre élément.Donc, ce que nous pouvons faire à la place, c'est d'appeler
$.proxy()
, de lui envoyer la fonction et la valeur que nous voulons attribuerthis
, et cela retournera une fonction qui conservera cette valeur.Donc, après avoir donné
$.proxy()
la fonction et la valeur que nous voulonsthis
, elle a renvoyé une fonction qui garantira qu'ellethis
est correctement définie.Comment ça marche? Il renvoie simplement une fonction anonyme qui appelle notre fonction à l'aide de la
.apply()
méthode, ce qui lui permet de définir explicitement la valeur dethis
.Un aperçu simplifié de la fonction renvoyée peut ressembler à ceci:
Donc, cette fonction anonyme est donnée à
setTimeout
, et tout ce qu'elle fait est d'exécuter notre fonction d'origine avec lethis
contexte approprié .la source
$.proxy(function () {...}, this)
plutôt que(function() {...}).call(this)
? Y a-t-il une différence?.call
vous appelez la fonction immédiatement. Avec$.proxy
, c'est commeFunction.prototype.bind
là où il renvoie une nouvelle fonction. Cette nouvelle fonction a lathis
valeur liée de façon permanente, de sorte que lorsqu'elle est transmise àsetTimeout
etsetTimeout
appelle la fonction plus tard, elle aura toujours lathis
valeur correcte .Sans entrer dans les détails (ce qui serait nécessaire car il s'agit de Contexte dans ECMAScript, la variable de contexte this etc.)
Il existe trois types différents de «contextes» dans ECMA- / Javascript:
Chaque code est exécuté dans son contexte d'exécution . Il y en a un contexte global et il peut y avoir de nombreuses instances de contextes de fonction (et d'évaluation). Maintenant la partie intéressante:
Chaque appel d'une fonction entre dans le contexte d'exécution de la fonction. Un contexte d'exécution d'une fonction ressemble à ceci:
La
portée de l' objet d'activation Chaîne
cette valeur
Donc, cette valeur est un objet spécial qui est lié au contexte d'exécution. Il existe deux fonctions dans ECMA- / Javascript qui peuvent changer la valeur this dans un contexte d'exécution de fonction:
Si nous avons une fonction,
foobar()
nous pouvons changer la valeur this en appelant:Maintenant, nous pouvons accéder à
foobar
l'objet que nous avons passé:C'est exactement ce que
jQuery.proxy()
fait. Il prend unfunction
andcontext
(qui n'est rien d'autre qu'un objet) et lie la fonction en invoquant.call()
ou.apply()
et renvoie cette nouvelle fonction.la source
J'ai écrit cette fonction:
la source
Le même objectif peut être atteint en utilisant une fonction
auto-exécutable "Expression de fonction immédiatement appelée, abrégée: IIFE" :la source