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

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();
});

I get:

inside function <ip_address>
function is done <ip_address>

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


1
()表示调用。您传递的不是函数 printIP,而是它被调用后的结果。 - Paul S.
3个回答

4
您的代码报错了
}).done(printIp());

这段代码的作用是调用printIp函数,并使用函数调用的结果作为done方法的参数。实际上你想要的是将函数作为done处理程序传递。请改用}).done(printIp);来实现。

2

您正在立即执行printIp。请尝试在不使用()的情况下运行:

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

2
使用 () 时,您正在执行一个函数,而不使用 () 时,您实际上是将该函数作为参数传递。 - Amberlamps

2

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

.done(printIp)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接