2013-06-13 36 views
6

我對javascript比較新手。我寫了開始計數到10時,直到它達到1如何將參數傳遞給setTimeout函數

<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+'到倒計時功能的簡單的計數器程序。

var timer = setTimeout('countDown('+secs+')',1000); 

以上更改的作品。

我的問題是爲什麼我需要傳遞參數爲'+ secs +'而不是'secs'? 它有什麼不同?

+1

[這裏](HTTP: //stackoverflow.com/a/10313023/1144176)'s精彩概述如何正確使用'setTimeout'。 –

+0

@JakeStoeffler真棒鏈接! – rab

+0

可能重複的[JavaScript,setTimeout](http://stackoverflow.com/questions/10312963/javascript-settimeout) – jahroy

回答

10

使用

var timer = setTimeout(function(){ 
     countDown(secs) 
    },1000); 

var timer = setTimeout('countDown(' + secs + ')',1000); 

在你的情況下,問題是你用字符串連接用的變量,而不+符號(我的第二個例子)與將導致語法錯誤

+0

用戶想要傳遞'secs'變量,所以它應該是'countDown(secs)' – rab

+0

@ rab是的,只是更正 –

+0

謝謝@rab這個工程。你能否解釋或指出某種解釋? – vijju

1

只需編寫一個閉包來執行遞減,如下所示:

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); 
} 

我也刪除了clearTimeout()以支持簡單的else條件。

9

你的第一次嘗試是synax錯誤:

var timer = setTimeout('countDown('secs')',1000); 

你試圖傳遞一個字符串到setTimeout(這是一個糟糕的想法,開始),但你不能正確創建的字符串。

secs周圍的單引號不被轉義,所以你實際上傳遞字符串字面countDown(後面是變量secs,其次是字符串字面)。 因爲字符串之間沒有運算符,所以這是無效的語法。

但是,當您使用+符號,您要添加3串在一起,以創建所需的方法調用(+運算符用於連接字符串在JavaScript):

'countDown(' + 'secs' + ')' === 'countDown(secs)' 

這三個字符串加在一起會創建一個包含有效JavaScript的字符串,因此它可以傳遞給setTimeout()函數。

雖然你可以一個字符串傳遞給的setTimeout(),更好的辦法是通過一個函數引用。

這通常是一個匿名函數是這樣完成的:

setTimeout(function() { 
    countDown(secs); 
}, 1000); 

如果您不需要傳遞參數,你可以這樣做:

function countDown() { 
    alert("10... 9... 8..."); 
} 

setTimeout(countDown, 1000); 

注意,當一個函數參考被指定爲變量,則不使用()符號。當您在JavaScript中的函數後面使用括號時,將調用該函數。

+0

謝謝@ jahroy這真的很有幫助 – vijju

+1

沒問題。樂意效勞。就像參考資料一樣,我始終認爲MDN文檔是JavaScript的最佳參考。所以......當我有一個關於_setTimeout()_如何工作的問題時,我總是做的第一件事是google [「_mdn javascript settimeout_」](https://developer.mozilla.org/zh-CN/docs/網絡/ API/window.setTimeout)。 – jahroy

+0

或者'settimeout -w3schools' :) –

1

setTimeout函數允許您將其他參數傳遞給函數。

var timer = setTimeout(countDown, 1000, secs); 

它在所有主要瀏覽器的支持,除了一些老版本的IE:因此,你可以按照如下重寫代碼。看到這個問題的更多細節:Why does Underscore.js have a delay function?

1

Aadit有正確的想法。我需要在循環中啓動多個超時,並且它們都以變量設置爲相同的值結束。 這裏是一個小提琴,說明爲什麼唯一可以非常好地工作的方法是Aadit's。

http://jsfiddle.net/85fmwew4/

for(i=0;i<10;i++){ 
    setTimeout(function(){bad(i)}, 1000) // bad for async 
    setTimeout(good, 1000, i)    // good for async 
} 
0

這是唯一爲我工作(通過變量的setTimeout在node.js中)的東西:

setTimeout(function(teamNum,zeroBase,position) { 
    spawnAI(roomIndex, 'scout', teamNum, position); 
}, timeToSpawn,teamNum,zeroBase,position); 
0
在現代瀏覽器中的JavaScript最近優化

現在,你可以簡單地做:

var timer = setTimeout(countDown(secs) , 1000);

3

一個簡單的方法使用的setTimeout做到這一點:

setTimeout(FunctionName,delay,arg1,arg2....); 

你的情況,你可以簡單地做這樣的:

setTimeout(countDown,1000,secs); 

我建議這個鏈接:http://javascript.info/settimeout-setinterval