2013-06-13 35 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