2014-02-10 105 views
0

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

每次调用该函数时,都会创建一个新函数。你怎么能避免问这种类型的问题?那么,你可以尝试组合一个简短的实验来确认它是否按照你期望的那样工作,或者只是相信JavaScript不会奇怪地表现出来。 – Ryan

+0

'switch'有一个case ='if'。最好使用正确的控制结构... –

+0

感谢minitech,但它不是那么容易测试。 (或者,我完全可以用这个功能来做到这一点,但时机可能会欺骗我;-)) – Leo

回答

1

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

至于在何处了解所有这些东西,我建议在Mozilla开发者网络上使用JavaScript Guide。在名为(惊喜!)Closures的章节中讨论了闭包。 MDN的另一个好资源是A re-introduction to JavaScript (JS Tutorial)。他们涵盖了很多相同的材料,但有不同的说明。

+0

谢谢,特德。非常好,那么我不需要考虑这种类型的代码。 ;-) – Leo

+0

@Leo - 呃,你总是要考虑你的代码(至少在编码时)。 :) –

+0

取决于我在做什么,@泰德。大多数时候我只是想要一些代码来做我想做的事情; ;-) – Leo