3

私はJavaScriptが初めてなので、なぜこのように動作するのかわかりません。

私は時計機能を持っています:

function updateClock()
{
var currentTime = new Date();

var currentHours = currentTime.getHours();
var currentMinutes = currentTime.getMinutes();
var currentSeconds = currentTime.getSeconds();
var currentMilliseconds = currentTime.getMilliseconds();

// Pad the minutes and seconds with leading zeros, if required
currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes;
currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds;

// Choose either "AM" or "PM" as appropriate
var timeOfDay = ( currentHours < 12 ) ? "AM" : "PM";

// Convert the hours component to 12-hour format if needed
currentHours = ( currentHours > 12 ) ? currentHours - 12 : currentHours;

// Convert an hours component of "0" to "12"
currentHours = ( currentHours == 0 ) ? 12 : currentHours;

// Update the time display
document.getElementById("clock").innerHTML = currentHours + ":" + currentMinutes + ":" + currentSeconds + " " + timeOfDay;
}

これは別のclock.jsファイルにあります。そのファイルを頭に含めます。

私はこれを下に置きますclock div

<script type="text/javascript">
setInterval("updateClock()", 1000);
</script>

そして、それは機能します。しかし、それを に変更するとsetInterval(updateClock(), 1000);、機能しません。関数呼び出しを引用符で囲む必要があることがわかるまで、関数が 1 回しか実行されない理由を突き止めるためにしばらく時間を費やしました。

異なる言語のバックグラウンドを持っているため、引用符で囲む必要がある理由がわかりません。"updateClock()"別の関数ではなく、関数に文字列を渡しているようです。関数全体をsetInterval(function(){ ... }, 1000).

4

2 に答える 2

8

setInterval()最初の引数として取る

  1. 評価されるコードの文字列 ( 'updateClock()') - に依存しているため、これは推奨される用途ではありませんeval()。文字列は JavaScript コードとして評価されます。
  2. 関数へのポインタ ( updateClock) - 括弧がないことに注意してください。JavaScript では、定義された関数は、を付けずにその名前を使用することで、 を呼び出すのではなく()、参照できます。ポインタは、 のように無名関数にすることもできますsetInterval(function(){stuff...}, time)。これは、定義された関数への参照と事実上同じことです。どちらも、名前があるかどうかに関係なく、メモリ内の関数の場所を指します。

したがって、あなたの場合、好ましい使用法は次のとおりです。

<script type="text/javascript">
  setInterval(updateClock, 1000);
</script>

いとこも同じsetTimeout()です。

于 2012-04-20T20:45:21.510 に答える
1

やってみました

setInterval( updateClock, 1000);
于 2012-04-20T20:45:25.427 に答える