在javascript中传递函数和函数调用本身有什么区别?

时间:2010-05-31 14:39:17

标签: javascript

在我正在构建的应用程序中,我正在轮询状态更新,我注意到如果调用如下,则超时会持续触发:

setTimeout($.get("http://localhost:8080/status", function(data) { UpdateStatus(data);}), 1000);

如果使用函数而不是每1000毫秒触发超时:

 setTimeout(function() {$.get("http://localhost:8080/status", function(data) { UpdateStatus(data);})}, 1000);

为什么?

3 个答案:

答案 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 - 这样做是没有意义的。 第一个参数应该是函数本身,而不是调用。

为什么它不断发射 - 一种奇怪的副作用,谁知道:)。