js中,动态绑定事件的问题

想给一组li的鼠标事件绑定不同的参数的同名函数

var liObj = window.document.getElementsByTagName("li");
for (var  i = 0; i < liObj.length; i++) {
    var element = liObj[i];
    element.onmouseover = function () {
        stopScroll(i);
    }
    element.onmouseout = goonScroll;
}


stopScroll(i);
是自己定义的一个函数,
现在问题是,按照我的理解,循环绑定的结果是
第一个li标签的onmouseover绑定了stopScroll(0);
第二个li标签的onmouseover绑定了stopScroll(1);

然而结果下来 每个li的onmouseover都绑定了stopScroll(6);
这是怎么回事?(liObj的长度是6,可是我想不通这里是怎么回事啊)

闭包或者自定属性
闭包

     element.onmouseover = (function (i) {
        return function(){stopScroll(i);}
    })(i)

自定义属性

     element.i=i
    element.onmouseover = function () {
        stopScroll(this.i);
    }

函数闭包,就能解决了,触发事件的时候,你的事件是不是早就绑定好了,绑定好的时候i是不是就已经为6了,所以,需要一个闭包保存这个i

这里涉及到JS中的事件队列与事件处理机制,具体的详解题主可以自己去研究.

把var声明的变量,用let声明就可以了;