タイマーを作ろうとしています。2 つの状況を比較してください (最初の状況は機能しますが、2 番目の状況は機能しません)。
- インライン JavaScript http://jsfiddle.net/x7xhA/
- 非インライン JavaScript http://jsfiddle.net/x7xhA/1/
何が問題ですか?
タイマーを作ろうとしています。2 つの状況を比較してください (最初の状況は機能しますが、2 番目の状況は機能しません)。
何が問題ですか?
これは、jsFiddle の「JavaScript セクション」のユーザーがよく遭遇する問題です。ご覧のとおり、「JavaScript セクション」に配置されたコードは、ハンドラーとして使用される関数内にラップされているload
ため、2 番目の例では、実際の出力結果は次のようになります。
<script type='text/javascript'>
//<![CDATA[
$(window).load(function(){
var seconds = 0;
function timedCount() {
$("#txt").val(seconds);
seconds += 1;
setTimeout("timedCount()",1000);
}
});
//]]>
</script>
これは、ハンドラーtimedCount
のスコープでのみ使用できるため、もはやグローバル関数ではありません。コードの文字列で使用すると、グローバル スコープから評価されます。load
setTimeout
これを修正する方法は次のとおりです。
setTimeout
への呼び出しを変更しますsetTimeout(timedCount, 1000);
これが行うことは、実際の関数オブジェクトを に渡すことsetTimeout
です。毎回グローバルスコープからコードの文字列を評価するのではなく、スコープがもはや問題にならないため、これは本質的に関数を呼び出す機能を保持します-関数をに渡しますsetTimeout
。
var seconds = 0;
function timedCount() {
$("#txt").val(seconds);
seconds += 1;
setTimeout(timedCount,1000);
}
をtimedCount
使用してグローバル関数を作成しますtimedCount = function() { ... };
これは単にtimedCount
グローバルを作成するだけなので、グローバル スコープからsetTimeout
評価しようとすると、グローバル スコープに関数timedCount();
があるため成功します。timedCount
var seconds = 0;
timedCount = function() {
$("#txt").val(seconds);
seconds += 1;
setTimeout("timedCount();",1000);
}
timedCount
2 つ目は関数を jQuery関数でラップするready
ため、グローバル スコープでは使用できません。