我有些难以理解闭包和作用域。我曾经相信自己已经理解了它们,但是我遇到了意想不到的行为。
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
}
我原以为onmouseover处理程序仍然可以访问包含图像的DocumentFragment。但是当我在控制台中查看时,它不再有任何子元素了。这个特定的匿名函数是否具有访问本次doSomething执行的局部变量值的能力,还是后续对doSomething的调用会影响先前执行的闭包?如果后者成立,则我的情况就可以理解,因为后续对frag的调用可能为空。
doSomething
并重新绑定了事件?不确定这是否会丢弃旧的事件绑定(不太了解浏览器中的 JS)。 - Merlyn Morgan-Graham