Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的作用域、闭包和绑定。为什么我的循环不能正常工作?_Javascript_Variables_Dictionary_Scope_Closures - Fatal编程技术网

javascript中的作用域、闭包和绑定。为什么我的循环不能正常工作?

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

我试图创建一个列表,以便在单击LI元素时,显示一个特定的div。 我想从字典中读取div的id和其他属性。 因此,字典如下所示:

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
的当前值,并将其传递给单击处理程序。请看我的编辑,顺便说一句,我对它做了一些修改,以使它更清楚地显示正在发生的事情。谢谢,链接到臭名昭著的循环有帮助,还有“循环中的闭包:常见错误”一节,欢迎您。还有很多关于这个问题的讨论和例子。