为什么Javascript需要匿名函数来延迟执行?

时间:2013-08-30 12:18:10

标签: javascript jquery

在我的应用程序中,我需要进行IP查找,作为继续执行需要该数据的另一个函数的先决条件。最初,我把这个函数调用如下:

$(document).ready(function(){

var ipUrl = "myURL?callback=?";    
$.getJSON(ipUrl, function(data) {
        window.ip = data['ip'];
        console.log("inside function" + window.ip);
    }).done(printIp());
});

function printIp() {
    console.log("function is done " + window.ip);   
}

但是,输出为

function is done undefined 
inside function <ip_address>

即。在printIp()实际完成之前调用$.getJSON函数。

但是,如果我在匿名函数中包含printIp()调用,如下所示:

$.getJSON(ipUrl, function(data) {
    window.ip = data['ip'];
    console.log("inside function" + window.ip);
}).done(function() {
    printIp();
});

我明白了:

inside function <ip_address>
function is done <ip_address>

正如我所料。这里发生了什么?为什么我需要在匿名函数中包装函数调用?

3 个答案:

答案 0 :(得分:4)

你的代码说

}).done(printIp());

这样做是调用 printIp并使用函数调用的结果作为done方法的参数。

你真正想要的是将该函数作为done处理程序传递。使用}).done(printIp);来代替。

答案 1 :(得分:2)

您正在执行printIp。不使用()

尝试
$.getJSON(ipUrl, function(data) {
    window.ip = data['ip'];
    console.log("inside function" + window.ip);
}).done(printIp);

答案 2 :(得分:2)

传递没有parantheses的函数,否则你马上调用它:

.done(printIp)