javascript中的作用域、闭包和绑定。为什么我的循环不能正常工作?
我试图创建一个列表,以便在单击LI元素时,显示一个特定的div。 我想从字典中读取div的id和其他属性。 因此,字典如下所示:javascript中的作用域、闭包和绑定。为什么我的循环不能正常工作?,javascript,variables,dictionary,scope,closures,Javascript,Variables,Dictionary,Scope,Closures,我试图创建一个列表,以便在单击LI元素时,显示一个特定的div。 我想从字典中读取div的id和其他属性。 因此,字典如下所示: var ifSrc = {"welcome":"welcome.html", "proceduresAndComputers":"../proceduresAndComputers/index.html", "someId":"../someSourceFileForAnIFrame"} 以及形成这些LI元素的功能 funct
var ifSrc = {"welcome":"welcome.html",
"proceduresAndComputers":"../proceduresAndComputers/index.html",
"someId":"../someSourceFileForAnIFrame"}
以及形成这些LI元素的功能
function createMenu(){
var listy = document.getElementById("sidebar");
for(var key in ifSrc){
var elem = document.createElement('li');
elem.innerHTML = key;
elem.className = "unselected";
elem.addEventListener("click",function(){openDiv(this,key);},false);
listy.appendChild(elem);
}
listy.firstElementChild.className="selected";
}
因此,菜单(带LI元素的UL)看起来不错,但无论我点击哪个LI,openDiv函数都会为这个
传递正确的值,但为键
传递相同的值。特别是,它传递ifSrc
字典中key
的最后一个值。但是,每个元素的innerHTML(设置为键
)看起来很好。我检查了addEventListener的文档,没有找到多少
为什么会这样?有什么见解吗 只需确保捕获的键值正确(在下面的示例中,使用闭包)。按照现在的方式,
键
在所有单击事件中始终是对相同值的引用。通过执行以下操作,可以为每个单击事件复制键的当前值:
elem.addEventListener("click", (function(k) {
return function() {
openDiv(this, k);
}
})(key), false);
作为参考——查看“臭名昭著的循环问题”,如。所以当我循环字典的键时,javascript不会计算键,而是在运行时,当调用eventListener时?这就是我想添加闭包的原因吗?如果是这样的话,为什么我没有得到所有的李项目说同样的事情?有什么好的指示吗?问题是你的内部函数。指定为单击事件的每个函数都引用了相同的键变量。通过使用闭包,您可以捕获key
的当前值,并将其传递给单击处理程序。请看我的编辑,顺便说一句,我对它做了一些修改,以使它更清楚地显示正在发生的事情。谢谢,链接到臭名昭著的循环有帮助,还有“循环中的闭包:常见错误”一节,欢迎您。还有很多关于这个问题的讨论和例子。