我有一个函数(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;
}
}
我从哪里学到这一点,所以我不必问这样的问题? ; - )
答案 0 :(得分:1)
回调函数是一个闭包 - 它引用了自变量rq
。对该回调的每次调用都将使用相同的rq
变量。但是,如果再次调用zReaderRequest
,它将创建一个新的闭包,引用存储在不同rq
中的不同对象(因为rq
在zReaderRequest
时出现输入功能)。我认为这是你想要的代码行为。
至于在哪里了解所有这些内容,我建议在Mozilla开发者网络上使用JavaScript Guide。闭包在名为(surprise!)Closures的章节中讨论。 MDN的另一个好资源是A re-introduction to JavaScript (JS Tutorial)。它们涵盖了很多相同的材料,但有不同的展示。