Javascript 函数内的变量+;回调

Javascript 函数内的变量+;回调,javascript,callback,scope,Javascript,Callback,Scope,我有一个函数(zReaderRequest,见下文),其中回调函数使用第一个函数的局部变量,即这里的“rq”。对函数zReaderRequest的新调用将创建一个新变量“rq”,还是回调函数将使用相同的“rq”?如果他们使用相同的,我能做什么?创建包含此函数的对象,或者 function zReaderRequest(zURL, outputElt, displayFun) { switch (outputElt.dataset.zReaderStatus) { case und

我有一个函数(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;
    }
}

我从哪里学到这些,这样我就不必问这样的问题了?;-)

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


至于在哪里学习这些东西,我推荐Mozilla开发者网络。闭包在名为(惊奇!)的一章中讨论。MDN的另一个好资源是。它们涵盖了许多相同的材料,但有不同的说明。

每次调用该函数时,它都会生成一个新函数。你怎么能避免问这种问题?好吧,你可以试着做一个简短的实验来确认它是否如你所期望的那样工作,或者只是相信JavaScript不会表现得太奇怪。
切换
,一个案例=
如果
。最好使用正确的控制结构…感谢minitech,但它不是那么容易测试。(或者,我完全可以用这个函数来实现,但计时可能会愚弄我。;-)是的,但这样做更能证明未来,@T.J.Crowder…;-)谢谢,特德。非常好,那么我就不必过多地考虑那种类型的代码了。;-)@Leo-Er,你总是要考虑你的代码(好吧,至少在你编码的时候)“这取决于我在做什么,”特德说。大多数时候,我只是想要一些代码来完成我想要的…;-)重新介绍对我来说是一个很好的开始。我还发现“处理对象”这本书读起来很愉快。“闭包”让我有点怀疑。他们怎么说?这是否也在IE之外创建了一个内存循环?etc.@Leo-内存循环仅在IE中存在问题,并且仅当闭包用作DOM元素上的事件处理程序并且对DOM元素的引用在闭包的作用域中时才存在问题。您的代码似乎不太可能做到这一点。