【问题标题】:Variables inside functions + callbacks函数内的变量 + 回调
【发布时间】:2014-02-10 22:16:19
【问题描述】:

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

我在哪里可以学到这一点,这样我就不必问这样的问题了? ;-)

【问题讨论】:

  • 每次调用该函数时,它都会创建一个新函数。你怎么能避免问这种类型的问题?好吧,您可以尝试进行一个简短的实验来确认它是否按您的预期工作,或者只是相信 JavaScript 不会表现出奇怪的行为。
  • switch 一个案例 = if。最好使用正确的控制结构...
  • 感谢minitech,但测试起来并不容易。 (或者,我可以用这个函数来做,但时间可能会欺骗我。;-))
  • 是的,但这种方式更具前瞻性,@T.J.Crowder... ;-)

标签: javascript callback scope


【解决方案1】:

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

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

【讨论】:

  • 谢谢,泰德。非常好,那么我不必过多考虑那种类型的代码。 ;-)
  • @Leo - 呃,你总是要考虑你的代码(嗯,至少在你编码的时候)。 :)
  • 取决于我在做什么,@Ted。大多数时候我只是想要一些代码来做我想做的事情...... ;-)
  • 重新介绍对我来说是一个很好的开始。我还发现“Working with objects”读起来很愉快。 “闭包”让我有点怀疑。他们说了什么?这是否也在 IE 之外创建了一个内存循环,或者?等
  • @Leo - 内存循环仅在 IE 中是一个问题,并且仅当闭包用作 DOM 元素上的事件处理程序并且对 DOM 元素的引用在闭包的范围内时。您的代码似乎还没有做到这一点。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2018-08-17
相关资源
最近更新 更多