2009-06-09 12 views
2

で呼び出されたときのJavascriptリテラルはその変数を失い、私は、コードのこの部分を持っている、と私は(大きなプログラムから蒸留し、それのデモコード、)期待通りに動作しません。のsetTimeout

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title>Test</title> 

<script language="javascript" type="text/javascript"> 
var test = { 
    variable: true, 
    go: function() { 
     alert(this.variable); 
    } 
}; 

function s() { 
    test.go(); 
    setTimeout(test.go, 500); 
} 

</script> 

</head> 
<body> 
<form action="#"> 
<input type="button" value="Go" onclick="s();" /> 
</form> 
</body> 
</html> 

私はをクリックしますIEとFFの両方の[移動]ボタン(私が気にしている気になる唯一のブラウザ)では、最初のアラートボックスには "true"が表示され、2番目には "未定義"と表示されます。

私の質問はなぜですか、どうすれば避けることができますか?

答えて

11

setTimeoutは、渡された関数をウィンドウのコンテキストで実行するため、 'this'はウィンドウを参照します。代わりにこれを試してみてください:

setTimeout(function(){ 
    test.go(); 
}, 500); 
2

"this"はタイムアウトから "go"を呼び出すときに何かを指しているようです。おそらくウィンドウを指しています。

setTimeout(function(){test.go()}, 500); 

この

var fn = function(){ 
    test.go.apply(test, []); 
} 
setTimetout(fn, 500); 
+0

ありがとうございます、あなたの答えは最初でしたが、他のものは短かったので、私はそれらの1つを受け入れました。 – Tominator

4

変更ラインを

setTimeout(test.go, 500); 

のようなものを試してみて、あなたのスクリプトが正常に動作shoud。