【发布时间】:2013-11-23 19:10:40
【问题描述】:
我正在使用以下命令暂停 javascript 几秒钟:
setTimeout(start_countdown(),3000);
它不起作用,无论秒数如何都会调用该函数。但是,以下函数确实有效,但不使用函数。
setTimeout(alert('hi'),3000);
我该如何解决这个问题?
【问题讨论】:
标签: javascript jquery
我正在使用以下命令暂停 javascript 几秒钟:
setTimeout(start_countdown(),3000);
它不起作用,无论秒数如何都会调用该函数。但是,以下函数确实有效,但不使用函数。
setTimeout(alert('hi'),3000);
我该如何解决这个问题?
【问题讨论】:
标签: javascript jquery
你需要传递一个函数引用。您正在传递函数的返回值。
不同之处在于:一个是您想要执行的功能的蓝图,另一个意味着您正在立即执行该功能并将其返回值传递给setTimeout。
setTimeout(start_countdown, 3000);
如果您想做一些比简单地调用命名函数更复杂的事情,或者您想将参数传递给命名函数,则需要将匿名函数传递给超时并在其中调用您的函数:
setTimeout(function() {
start_countdown(/* possible params */);
/* other code here as required */
}, 3000);
【讨论】:
setTimeout的第一个参数中添加括号吗?我注意到如果我们添加(),该函数将立即触发。这是为什么?我不知道setTimeout 的实际工作原理...
setTimeout 注册一个异步事件,该事件将在(大约)您指定的毫秒数内执行。它期望作为它的第一个参数 FUNCTION - 函数文字或对其他地方指定的引用。如果你传递了一个函数名,但在它后面加上(),那么你实际上是在那里执行该函数,而不是要求稍后调用该函数。你需要了解函数引用和函数调用的区别。
如果你不需要传递参数,不要使用 ()
setTimeout(start_countdown,3000);
如果你这样做,你必须包装你的函数
setTimeout(function(){start_countdown(parameter)},3000);
【讨论】:
改写
setTimeout(start_countdown, 3000);
没有括号()
第二个例子也可以写成
setTimeout(function() { alert('hi'); }, 3000);
【讨论】:
在不同的浏览器中,它以不同的方式工作。在 IE 中你需要使用匿名函数将参数传递给回调:
setTimeout(function(){alert('hi')},3000);
【讨论】: