Javascript - 在addEventListener中传递参数导致对象发生变化?

时间:2016-11-22 18:25:03

标签: javascript

这可能很难解释,所以请耐心等待。

for (var i = 0; i < this.array.length; i++) {
  var object = this;
  (function(object, i) {
    object.array[i].addEventListener(event, function() {
      func(i)
    }, false)
  }(object, i));
}

此处的数组是使用查询选择器创建的HTML元素的集合。

此代码保存在传递参数'func'的原型方法中。为'func'传递的值是一个匿名函数。

使用上面的代码,我可以成功地将计数器'i'传递回匿名函数。

其他一种方法,将使用Javascript的parentNode函数而不是元素数组。这是问题,上面的代码导致错误导致数组元素不是对象。

但是,当使用此代码时,不会发生错误。

for (var i = 0; i < this.array.length; i++) {
  var object = this;
  (function(object, i) {
    object.array[i].addEventListener(event, func, false)
  }(object, i));
}

因此,出于某种原因,在addEventListener中的匿名函数中包装'func'正在更改数组元素,至少看起来是这样。但这似乎没有意义?

2 个答案:

答案 0 :(得分:0)

你可以在这里使用bind。

检查此代码段

for (var i = 0; i < this.array.length; i++) {
   var object = this;
   object[array[i]].addEventListener('click', fun.bind(this, i), f‌alse);
 }

 function func(i) {
   alert(i);
 }

希望有所帮助

答案 1 :(得分:0)

           (function (object,i) {

            object.array[i].addEventListener('click', 

            function(event){
            var targetElement = event.target || event.srcElement;
            func(targetElement,i);
            }, 

            false);

            }(object,i)); 

这最终对我有用,通过将事件传递给动态函数,我可以根据需要引用被点击元素的parentNode。