Définir variable “ce” facilement?
J'ai une assez bonne connaissance de Javascript, sauf que je ne peux pas comprendre, une belle façon de définir la variable "ce". Considérer:
var myFunction = function(){
alert(this.foo_variable);
}
var someObj = document.body; //using body as example object
someObj.foo_variable = "hi"; //set foo_variable so it alerts
var old_fn = someObj.fn; //store old value
someObj.fn = myFunction; //bind to someObj so "this" keyword works
someObj.fn();
someObj.fn = old_fn; //restore old value
Est-il un moyen de le faire sans les 4 dernières lignes? C'est plutôt gênant... j'ai essayé de la liaison à une fonction anonyme, j'ai pensé que c'était beau et intelligent, mais en vain:
var myFunction = function(){
alert(this.foo_variable);
}
var someObj = document.body; //using body as example object
someObj.foo_variable = "hi"; //set foo_variable so it alerts
someObj.(function(){ fn(); })(); //fail.
Évidemment, de passer la variable dans la fonction myFunction est une option... mais ce n'est pas le point de cette question.
Grâce.
Vous devez vous connecter pour publier un commentaire.
Il y a deux méthodes définies pour toutes les fonctions en JavaScript,
call()
, etapply()
. La syntaxe de la fonction ressemble à:Ce que ces fonctions à faire est d'appeler la fonction qu'ils ont invoqué, d'affecter la valeur de la objet paramètre ce.
$.proxy(function, element)
de sorte que chaque fois que cette fonction est appelée, elle sera dans le contexte de l'élément. api.jquery.com/jquery.proxy.bind()
Je pense que vous êtes à la recherche pour
appel
:Ce appels
myFunction
avecthis
ensemble deobj
.Il y a aussi la méthode légèrement différente
appliquer
, qui prend des paramètres de la fonction dans un tableau:Si vous voulez "stocker" les
this
de la valeur à une fonction de sorte que vous pouvez appeler cela de façon transparente plus tard (par exemple, lorsque vous n'avez pas accès à cette valeur plus), vous pouvezbind
(pas disponible dans tous les navigateurs tout de même):bind
est apparemment disponible dans IE9+, FF4+, Safari 5.1.4+ et google Chrome 7+ (source). Vous pouvez également appeler bind directement sur une fonction anonyme:var myFunction = function(){ /* this = something */ }.bind(something);
Ma recherche sur la façon de lier
this
m'a amené ici, donc je vous poste mes conclusions: Dans "ECMAScript de 2015", nous pouvons également définir cette lexicalement l'aide des touches flèche fonctions.Voir: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Au lieu de:
Nous pouvons maintenant faire:
Réglage de la
this
mot-clé en javascript.Javascript a 3 méthodes intégrées pour le réglage de la
this
mot-clé idéalement. Ils sont tous situés sur laFunction.prototype
objet de sorte que chaque fonction peut les utiliser (puisque chaque fonction hérite de ce prototype via prototypes d'héritage). Ces fonctions sont les suivantes:Function.prototype.call()
: Cette fonction prend l'objet que vous souhaitez utiliser commethis
comme premier argument. Puis le reste des arguments sont des arguments de la fonction qui est appelée.Function.prototype.apply()
: Cette fonction prend l'objet que vous souhaitez utiliser commethis
comme premier argument. Le deuxième argument est un tableau qui contient les valeurs des arguments de la fonction qui est appelée (premier élément du tableau est le premier argument de la fonction, le deuxième argument de la matrice est le deuxième argument de la fonction, etc.).Function.prototype.bind()
: Cette fonction retourne une nouvelle fonction, qui a une valeur différente dethis
. Il prend l'objet que vous souhaitez définir comme l'this
valeur en tant que premier argument et renvoie un nouvel objet de fonction.Différence entre les appels/appliquer et à lier:
call
etapply
sont similaires dans le fait qu'ils immédiatement appeler la fonction (avec une valeur prédéfinie dethis
)bind
est différente decall
etapply
dans le fait que cette fonction retourne une nouvelle fonction avec une autre liaison de lathis
valeur.Exemples:
JS: