Javascript 理解闭包及其范围
我很难理解闭包和作用域。我很确定我明白这一点,直到我有了意想不到的行为Javascript 理解闭包及其范围,javascript,scope,closures,Javascript,Scope,Closures,我很难理解闭包和作用域。我很确定我明白这一点,直到我有了意想不到的行为 function doSomething () { // Code unrelated to frag var rightDiv = document.createElement(rightDiv); var img, i, frag = document.createDocumentFragment(); for (i = 0; i < photoIDs.length; i++){
function doSomething () {
// Code unrelated to frag
var rightDiv = document.createElement(rightDiv);
var img, i, frag = document.createDocumentFragment();
for (i = 0; i < photoIDs.length; i++){
img = new Image();
addClass(img, "popup-image-preview");
img.src = "photos/"+photoIDs[i]+".jpg";
frag.appendChild(img)
}
// add popup for preview
addEvent(rightDiv, "mouseover", function() {
showPopup(frag, this);
console.dir(frag);
});
// more code unrelated to frag
}
函数doSomething(){
//与frag无关的代码
var rightDiv=document.createElement(rightDiv);
var img,i,frag=document.createDocumentFragment();
对于(i=0;i
我希望onmouseover处理程序仍然可以访问包含图像的DocumentFragment。但当我在控制台中查看它时,它不再有任何子项。此特定匿名函数是否可以访问此特定执行doSomething的局部变量的值,或者对doSomething的后续调用是否会影响以前执行的闭包?后者将使我的情况可以理解,因为后续对doSomething的调用可能会有一个空的frag一般来说,您是对的,您的代码应该按照您的预期工作。但有几件事让我们感到疑惑:
- 哪里定义了
?看起来您正在向该“节点”添加越来越多的rightDiv
事件,因为它不是上下文的一部分mouseover
或addEvent
是否修改showPopup
变量上的任何内容frag
showPopup
中将frag
附加到文档节点。我不知道这会导致DocumentFragment被清空。我现在正在showPopup
中使用node.appendChild(frag.cloneNode(true))
多亏了大家的帮助我相信这一结束应该如预期的那样起作用。Orden.AFAIK,你的假设是对的,这一定有不同的原因,或者你遇到了一些紧急情况……我想知道这是否是因为你正在调用
doSomething
,并重新绑定你的事件?不确定这是否会丢弃旧的事件绑定(我不太了解浏览器中的JS)。它对我很有用:。啊。。因此,如果我删除showPopup(..)的调用,控制台将按预期输出。这显然是我的错。showPopup将文档片段附加到一个div中。我假设出现这种情况时,DocumentFragment对象中的子对象将被清空?抱歉。。是 啊我现在做了一次编辑,解释它对于每次执行都是唯一的。@rewolf:您能不能显示代码,它在哪里声明,以及它是如何定义的?我添加了它的定义行。doSomething基本上是创建一个包含信息的div和另一个div rightDiv,它允许您在弹出窗口中查看图像。但是有很多这样的div,每个div都是由doSomething创建的,有些没有弹出窗口。谢谢。这是他的错。我没有意识到将DocumentFragment附加到节点会清空子节点的DocumentFragment。我现在正在使用cloneNode。