タイマーを作ろうとしています。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のスコープでのみ使用できるため、もはやグローバル関数ではありません。コードの文字列で使用すると、グローバル スコープから評価されます。loadsetTimeout
これを修正する方法は次のとおりです。
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);
}
timedCount2 つ目は関数を jQuery関数でラップするreadyため、グローバル スコープでは使用できません。