3

在我的应用程序中,我需要进行 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>

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

4

3 回答 3

4

你的代码说

}).done(printIp());

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

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

于 2013-08-30T12:23:50.810 回答
2

您正在printIp立即执行。尝试不使用()

$.getJSON(ipUrl, function(data) {
    window.ip = data['ip'];
    console.log("inside function" + window.ip);
}).done(printIp);
于 2013-08-30T12:22:14.810 回答
2

不带括号传递函数,否则您将立即调用它:

.done(printIp)
于 2013-08-30T12:23:17.793 回答