次の関数を書きました。
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/で見つけることができます