JavaScript为什么for循环的索引在添加eventlisteners时会添加一个

时间:2018-06-16 08:17:05

标签: javascript arrays loops addeventlistener

我有一个可能听起来很愚蠢的问题。在下面的代码中有2个console.log(i)语句。我想知道为什么第二个console.log(i)语句在第一次迭代时返回值2而不是1作为前者(即第一个语句i=n,第二个:i=n+1)。在循环结束之前,不应该都等于1吗?

function toggleWrapper(){
    var el1 = document.querySelectorAll('[class="tCell entryDesc"]');

    for (var i = 1; i < el1.length; i++) {
        console.log(i);
        el1[i].addEventListener('click', function(ev){
             console.log(i);
             var el2=document.querySelectorAll('[class="additionalInfoContainer"]');
             if (el2[i-2].clientHeight) {
                 el2[i-2].style.maxHeight = 0;
             }
             else{
                 el2[i-2].style.maxHeight = el2[i-2].scrollHeight +"px";
             }
        },
        false);
    }
}

2 个答案:

答案 0 :(得分:0)

问题在于,每个addEventListener()函数中的变量i都绑定到函数外部的同一变量。只需将for循环更改为:

for (let i = 1; i < el1.length; i++)

在带有基于let的索引的循环中,循环中的每次迭代都会有一个新值i,其中每个值都在循环中作用域,因此您的代码可以正常工作。

答案 1 :(得分:0)

我认为你的代码中有一些东西,因为如果你尝试使用两个“console.log()”进行for循环,那就不会那样做