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。