在我正在构建的应用程序中,我正在轮询状态更新,我注意到如果调用如下,则超时会持续触发:
setTimeout($.get("http://localhost:8080/status", function(data) { UpdateStatus(data);}), 1000);
如果使用函数而不是每1000毫秒触发超时:
setTimeout(function() {$.get("http://localhost:8080/status", function(data) { UpdateStatus(data);})}, 1000);
为什么?
答案 0 :(得分:3)
在第一个示例中,setTimeout
的第一个参数被分配$.get
的结果(错误),而在第二个示例中,它实际上是接收参数type函数,每隔x毫秒就会被正确评估为一组javascript语句。
答案 1 :(得分:3)
在第一个示例中,您调用 $.get
,然后将其返回值传递给setTimeout
。在第二个例子中,你根本没有调用函数;您正在为setTimeout
提供 it 稍后会调用的函数,然后会为您调用$.get
。
使用更简单的测试用例更容易看到:
function test() {
alert("Hi there!");
}
// WRONG, *calls* `test` immediately, passes its return value to `setTimeout`:
setTimeout(test(), 1000);
// Right, passes a reference to `test` to `setTimeout`
setTimeout(test, 1000);
请注意,第一个有括号(()
),第二个没有括号。
如果要将参数传递给函数,则必须通过定义另一个函数来间接执行:
function test(msg) {
alert(msg);
}
// WRONG, *calls* `test` immediately, passes its return value to `setTimeout`:
setTimeout(test("Hi there!"), 1000);
// Right, passes a reference to a function (that will call `test` when called) to `setTimeout`
setTimeout(function() { test("Hi there!"); }, 1000);
答案 2 :(得分:0)
你不应该将函数调用的结果传递给setTimeout
- 这样做是没有意义的。
第一个参数应该是函数本身,而不是调用。
为什么它不断发射 - 一种奇怪的副作用,谁知道:)。