函数内部的变量+回调

时间:2014-02-10 22:16:20

标签: javascript callback scope

我有一个函数(zReaderRequest,见下文),其中回调函数使用的是第一个函数的局部变量,即" rq"这里。对函数zReaderRequest的新调用是否会创建一个新变量" rq"或者回调函数是否会使用相同的" rq"?如果他们使用相同的,我该怎么办?创建一个包含此函数的对象,或?

function zReaderRequest(zURL, outputElt, displayFun) {
    switch (outputElt.dataset.zReaderStatus) {
    case undefined:
        outputElt.dataset.zReaderStatus = "requested";
        var rq = new XMLHttpRequest();
        rq.onload = function() {
            if (displayFun(rq, outputElt))
                outputElt.dataset.zReaderStatus = "received";
            else
                outputElt.dataset.zReaderStatus = "failed";
        };
        rq.open("GET", zURL, true);
        rq.setRequestHeader("Zotero-API-Version", "2");
        rq.send();
        break;
    }
}

我从哪里学到这一点,所以我不必问这样的问题? ; - )

1 个答案:

答案 0 :(得分:1)

回调函数是一个闭包 - 它引用了自变量rq。对该回调的每次调用都将使用相同的rq变量。但是,如果再次调用zReaderRequest,它将创建一个新的闭包,引用存储在不同rq中的不同对象(因为rqzReaderRequest时出现输入功能)。我认为这是你想要的代码行为。

至于在哪里了解所有这些内容,我建议在Mozilla开发者网络上使用JavaScript Guide。闭包在名为(surprise!)Closures的章节中讨论。 MDN的另一个好资源是A re-introduction to JavaScript (JS Tutorial)。它们涵盖了很多相同的材料,但有不同的展示。