61 votes

setTimeout () dans la classe JavaScript en utilisant "this"

J'essaie d'utiliser setTimeout() dans une fonction de classe en JavaScript. Le setTimeout() est censé déclencher une autre méthode dans la même classe, donc la fonction que je lui passe est écrite sous la forme window.setTimeout("this.anotherMethod", 4000) . Cela pose le problème : this référence l'objet appelant, dans le cas de setTimeout() c'est window . Comment puis-je utiliser des pièces jointes pour renvoyer une référence à l'objet de classe lui-même ?

 myObject = function(){

this.move = function(){
    alert(this + " is running");
}
this.turn = function(){
    alert(this + " is turning");
}
this.wait = function(){
    window.setTimeout("this.run" ,(1000 * randomNumber(1,5)));
}

this.run = function(){
    switch(randomNumber(0,2)){
        case 0:
            this.move();
        break;
        case 1:
            this.turn();
        break;
        case 2:
            this.wait();
    }
}

}

100voto

Tikhon Jelvis Points 30789

Tu peux le faire:

  var that = this;
 setTimeout(function () {
     that.doStuff();
 }, 4000);

Vous pouvez également bind pour un code plus succinct (comme indiqué à l'origine par @Raynos) :

 setTimeout(this.doStuff.bind(this), 4000);

bind est une fonction de bibliothèque standard pour exactement ce modèle de codage (c'est-à-dire la capture de this lexicalement).

12voto

Raynos Points 82706

Vous pouvez également lier une fonction à la portée.

setTimeout(this.run.bind(this) ,(1000 * randomNumber(1,5)));

Soyez averti que Function.prototype.bind est ES5

8voto

GordonM Points 14008

this peut être problématique en javascript, comme vous l'avez découvert.

Je contourne généralement cela en créant un alias this à l'intérieur de l'objet afin que je puisse utiliser l'alias chaque fois que j'ai besoin d'une référence à l'objet conteneur.

 MyObject = function ()
{
    var self = this;

    // The rest of the code goes here

    self.wait = function(){
        window.setTimeout(self.run ,(1000 * randomNumber(1,5)));
    }
}

4voto

M Ahmed Mushtaq Points 41
class A{

   setTimeout(()=>{

       // here this != undefined because of arrow function

  },500);

}

4voto

Gijs Points 2708
this.wait = function(){
    var self = this;
    window.setTimeout(function() { self.run() } ,(1000 * randomNumber(1,5)));
}

Vous stockez donc la référence à l'objet sur lequel vous appelez .run dans une variable locale ("self").

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