2011-01-30 9 views
1

インスタンスのメソッドを750msの遅延で呼び出そうとしています。問題は、動作しないということです。私はsetIntervalとオブジェクトに何らかの問題があることを読んだので、おそらくsetTimeoutもあるでしょう。setTimeout( 'classInstance.doFoo(arg)'、750);

は、私がこれを持って言う:

function App() 
{ 
     this.doFoo = function (arg) 
     { 
      alert("bar"); 
     } 
} 

window.app = new App(); 
setTimeout('app.doFoo(arg)', 750);//doesn't work 
app.doFoo(arg); //works 

は、回避策はありますか?インスタンスと関数をsetTimeoutに渡すにはどうすればいいですか?

答えて

2

は次のように試してみてください:

function App() 
{ 
    this.doFoo = function (arg) { 
     alert(arg); 
    } 
} 

window.app = new App(); 
window.setTimeout(function() { 
    window.app.doFoo('arg'); 
}, 750); 
+0

@Twodordan、よろしくお願いいたします。 –

+6

説明:文字列をsetTimeoutに渡すと、Javascriptはコードを実行するために 'eval'する必要があります。 'eval'コードはあなたのメインコードとは異なるスコープで実行されるので、変数参照は簡単に中断することができます。匿名関数をsetTimeoutに渡す方がずっと良いですし、変数はすべて正しい範囲になります – Gareth

+0

@Gareth +1解説。 – alex

2

私は前の回答は少し微調整が必​​要だと思います。あなたが呼び出しているグローバル変数を設定しています。本当にあなたの 'クラス'のインスタンスを呼びたい場合は、これを試してみてください。

function App(message){ 
    this.name = 'instance'; 
    var self = this; 
    var x = setTimeout(function(){self.doFoo(message, x);}, 750); 
} 
App.prototype.name = 'proto'; 

//creating the function on the prototype is more efficient since it is only created once. if you do 'this.doFoo = function(){}' it's created for every instance of the function taking more memory. 

App.prototype.doFoo = function(arg, timer){ 
clearTimeout(timer); 
alert(this.name +' ' + arg) 
} 

var x = new App("hello world"); 
//should output ("instance hello world");