141 votes

Javascript : comment définir facilement la variable "this" ?

Je comprends assez bien le langage Javascript, mais je n'arrive pas à trouver une façon agréable de définir la variable "this". Pensez-y :

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

Y a-t-il un moyen de le faire sans les 4 dernières lignes ? C'est plutôt ennuyeux... J'ai essayé de lier une fonction anonyme, ce que je trouvais 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, passer la variable dans maFonction est une option... mais ce n'est pas le but de cette question.

Merci.

228voto

ForYourOwnGood Points 4872

Il y a deux méthodes définies pour toutes les fonctions en javascript, call() et apply(). La syntaxe des fonctions ressemble à ceci :

call( /\* object \*/, /\* arguments... \*/ );
apply(/\* object \*/, /\* arguments\[\] \*/);

Ces fonctions appellent la fonction sur laquelle elles ont été invoquées, en affectant la valeur de l'attribut objet pour ce .

var myFunction = function(){
    alert(this.foo_variable);
}
myFunction.call( document.body );

57voto

sth Points 91594

Je pense que vous cherchez call :

myFunction.call(obj, arg1, arg2, ...);

Cet appel myFunction avec this réglé sur obj .

Il existe également une méthode légèrement différente apply qui prend les paramètres de la fonction sous forme de tableau :

myFunction.apply(obj, [arg1, arg2, ...]);

19voto

pimvdb Points 66332

Si vous voulez "stocker" le this à une fonction afin de pouvoir l'appeler sans problème plus tard (par exemple, lorsque vous n'avez plus accès à cette valeur), vous pouvez bind (pas disponible dans tous les navigateurs cependant) :

var bound = func.bind(someThisValue);

// ... later on, where someThisValue is not available anymore

bound(); // will call with someThisValue as 'this'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X