この問題(または私が最初に見た最初のもの)は、文字列 "increment(obj)"をsetTimeout()
メソッドに渡していますが、obj
はstart()
メソッド内でのみ定義されています。渡す文字列は、タイムアウトトリガーまで実際には評価されません。その時点で変数obj
は有効範囲にありません。
これを回避する方法はいくつかあります。一つは次のように、代わりにJavaScriptの文字列のsetTimeout()
にクロージャを渡すことである。
function start(obj) {
var nextIncrement = function() {
increment(obj);
};
var t = setTimeout(nextIncrement, 1000);
}
別の(あまり好ましくないが)オプションは次のように、グローバルスコープにobj
を促進することである。一般的に
function start(obj) {
window.obj = obj;
var t = setTimeout("increment(obj)", 1000);
}
しかし、文字列をsetTimeout
に渡すことは避けてください。また、グローバルスコープに不必要に配置することも避けてください。あなたが見てきたように、それはスコープ解決に問題を引き起こす可能性があります。また、それほど簡単でない操作では、コードの管理性が大幅に低下します。可能であれば、常に関数クロージャを渡すことをお勧めします。
はまた、次のコード行がprobably not doing exactly what you expect次のとおりです。
parseInt(obj.innerHTML)
あなたはいつも、このような011
などの値との誤差を避けるために、parseInt
に基数の引数を提供しなければならない(むしろ11より、9である、それ理由先頭の0
のためにベース8で評価されます)。
parseInt(obj.innerHTML, 10)
...ベース10の解析を強制することで、これらの欠点を回避できます。とにかく
、ここでの例作業:あなたはsetTimeout
に渡す文字列はグローバルスコープではなく、関数内のスコープで評価され、かつので、あなたのobj
オブジェクトを参照していないのでhttp://jsfiddle.net/dSLZG/1
'setTimeout'ではなく' setInterval'が必要です。 – FK82
@ fk82彼はstartをもう一度呼び出すので、このシナリオではsetTimeoutは問題ありません。 –
@Gaby:あいまいです。コードはそれを行います。実際には私の意図は
の(...)内容は毎秒1ずつインクリメントされるべきだと思っています。 ":-)ユーザが毎秒正確にクリックしない限り、起こらないのはどれですか? – FK82