3

次の関数を書きました。

function obj()
{
     this.a;
}
obj.prototype.catch = function()
{
    alert('Catched')
}
obj.prototype.do = function()
{
    alert('called');
}

必要なのは、obj :: do()が呼び出された後にobj :: catch()を呼び出すことであり、呼び出しはobj :: do()内から実行する必要があります。したがって、objのローカル関数をsetTimeoutに渡す方法

私が試してみました

obj.prototype.do = function()
 { 
     window.setTimeout('"'+this.catch+'()"',1000);
     alert('called');
 }

それは動作しませんそれから私は試しました

 obj.prototype.do = function()
 { 
     window.setTimeout('"'+this+'.catch()"',1000);
     alert('called');
 }

Chromeコンソールで次のエラーが発生しました

Uncaught SyntaxError: Unexpected token ILLEGAL

だから私は次の汚い方法を試しました(それは本当に汚いですか?)

 obj.prototype.do = function()
 { 
     this.pid = randomVal(100);
     window['temp'+this.pid] = this;
     window.setTimeout("temp"+this.pid+".catch();",1000);
     alert('called');
 }
 function randomVal(bound)//returns a random number between 0 and <bound>
 {
       return (Math.floor(Math.random()*(bound)));
 }

それはうまくいった。

では、なぜ最初の2つのメソッドが機能しなかったのですか。グローバル変数なしで同じことを行う他の方法はありますか。2番目のメソッドと最後のメソッドはほぼ同じです。しかし、なぜ2番目のメソッドでエラーが発生するのですか。動作するコードはここ http://jsfiddle.net/jXhAs/で見つけることができます

4

4 に答える 4

8

文字列をsetTimeout…に渡さないでください。

var self = this; // Because the scope will change
setTimeout(function () { self.catch() },1000);

または、JS 1.8.5を使用している場合:

setTimeout(this.catch.bind(this),1000);

あなたはについてもっと読むことができますbind

于 2012-04-17T14:52:02.197 に答える
5

関数を(文字列ではなく)に渡す必要がありますsetTimeout

例:

var self = this;
setTimeout(function(){
    self.catch();
},1000);
于 2012-04-17T14:51:56.220 に答える
1

クロージャーを使用する

obj.prototype.do = function()
{ 
     window.setTimeout((function(that){
        return function(){
            that.catch();
        };
     })(this),1000);
     alert('called');
}
于 2012-04-17T14:51:27.140 に答える
0

なぜこのすべての努力をする必要があるのか​​ 、関数を渡すだけです。

function obj() {
    this.a;
}
obj.prototype.
catch = function() {
    alert('Catched')
}
obj.prototype.do = function() {
    setTimeout(this.
    catch, 1000);
}

var test = new obj();
test.do();​
于 2012-04-17T14:55:37.053 に答える