私はjavascriptに比較的慣れていません。 10から1に達するまでカウントダウンを開始する簡単なカウンタープログラムを作成しました。
<script type="text/javascript">
function countDown(secs) {
var element = document.getElementById("status");
element.innerHTML = "Please wait for "+secs+" seconds";
if(secs < 1) {
clearTimeout(timer);
element.innerHTML = '<h2>Countdown Complete!</h2>';
element.innerHTML += '<a href="#">Click here now</a>';
}
secs--;
---> **var timer = setTimeout('countDown('secs')',1000);**
}
</script>
<div id="status"></div>
<script type="text/javascript">countDown(10);</script>
次に、パラメータを'+secs+'
としてcountDown関数に渡してみました。
var timer = setTimeout('countDown('+secs+')',1000);
上記の変更は機能します。
私の質問は、なぜパラメータを「秒」だけでなく「+秒+」として渡す必要があるのですか?どんな違いがあるの?
使用する
var timer = setTimeout(function(){
countDown(secs)
},1000);
または
var timer = setTimeout('countDown(' + secs + ')',1000);
あなたの場合、問題は+
記号のない変数で文字列連結を使用していたことでした(私の2番目の例)と構文エラーが発生します
最初の試みはシナックスエラーです:
var timer = setTimeout('countDown('secs')',1000);
文字列をsetTimeout
に渡そうとしていますが(最初は悪い考えです)、文字列を正しく作成していません。
Word secs
を囲む一重引用符はエスケープされないため、実際には文字列リテラルcountDown(
、変数secs
、文字列リテラル)
の順に渡します。文字列間に演算子がないため、これは無効な構文です。
ただし、+
シンボルを使用する場合は、3つの文字列を一緒に追加して、必要なメソッド呼び出しを作成します(the+
演算子はJavaScriptで文字列を連結するために使用されます):
'countDown(' + 'secs' + ')' === 'countDown(secs)'
一緒に追加された3つの文字列は、有効なJavaScriptを含む文字列を作成するため、setTimeout()関数に渡すことができます。
can文字列をsetTimeout()に渡しますが、より良いアプローチは関数参照を渡すことです。
これは通常、次のような無名関数を使用して行われます。
setTimeout(function () {
countDown(secs);
}, 1000);
パラメータを渡す必要がない場合は、次のようにすることができます。
function countDown() {
alert("10... 9... 8...");
}
setTimeout(countDown, 1000);
関数参照が変数として指定されている場合は、()
シンボルを使用しないことに注意してください。 JavaScriptの関数の後に括弧を使用すると、関数が呼び出されます。
setTimeoutを使用してそれを行う簡単な方法:
setTimeout(FunctionName,delay,arg1,arg2....);
あなたの場合、あなたは単にそのようにすることができます:
setTimeout(countDown,1000,secs);
私はこのリンクを提案します: http://javascript.info/settimeout-setinterval
Aaditは正しい考えを持っていました。ループ内で複数のタイムアウトを開始する必要があり、それらはすべて変数が同じ値に設定されてしまいました。これは、非同期でうまく機能する唯一の方法がAaditのものである理由を説明するフィドルです。
for(i=0;i<10;i++){
setTimeout(function(){bad(i)}, 1000) // bad for async
setTimeout(good, 1000, i) // good for async
}
次のようにデクリメントを実行するには、クロージャーを記述します。
_if (secs < 1) {
element.innerHTML = '<h2>Countdown Complete!</h2>';
element.innerHTML += '<a href="#">Click here now</a>';
} else {
// wait 1 second
setTimeout(function() {
countDown(secs - 1); // decrement and run ourselves again
}, 1000);
}
_
また、単純なelse
条件を優先して、clearTimeout()
を削除しました。
setTimeout
関数を使用すると、追加のパラメーターを関数に渡すことができます。したがって、次のようにコードを書き直すことができます。
var timer = setTimeout(countDown, 1000, secs);
一部の古いバージョンのIEを除き、すべての主要なブラウザでサポートされています。詳細については、この質問を参照してください: nderscore.jsに遅延関数があるのはなぜですか?
これは私のために働いた唯一のものです(node.jsのsetTimeoutに変数を渡します):
setTimeout(function(teamNum,zeroBase,position) {
spawnAI(roomIndex, 'scout', teamNum, position);
}, timeToSpawn,teamNum,zeroBase,position);
最近のブラウザでの最近のJavaScriptの最適化により、次のことが簡単にできます。
var timer = setTimeout( countDown( secs ) , 1000 );