在for循环中将绑定添加到vanilla javascript中的原型对象

时间:2016-10-23 14:47:05

标签: javascript javascript-events javascript-objects

我有一个带有prototyped方法的javascript类,该方法使用for循环将一个事件监听器添加到一组对象并调用该类中的另一个方法。

为了能够访问类中的其他方法,我必须在事件监听器中绑定该函数,以便访问其他类方法。但是我总是在for循环中获得最高值,所以我在匿名函数中返回一个函数,但现在我无法使bind函数工作并找到另一个类方法。

    ToDoList.prototype = {
      addListener : function(){
        //inside for loop
        for(var i = 0; i < ToDoList.counter; i++){
          el.addEventListener("click", ((function(value){               
            return function(){ 
              this.remove(value); //trying to call this method
            };
            })(i)).bind(this)               
          );
        }

      }

      remove : function(index){
        //do some stuff if you can get to me         
      }
    }

上面的代码仅适用于for循环的最后一个值。有没有什么方法可以让代码处理for循环中的所有值。

提前致谢

2 个答案:

答案 0 :(得分:1)

bind函数返回一个新函数,this设置为bind的第一个参数,所有后续参数作为参数传递。

如果使用bind

,则不需要关闭
ToDoList.prototype = {
  addListener: function() {
    for (var i = 0; i < ToDoList.counter; i++) {
      el.addEventListener("click", function(value) {
        // `this` is the same as outer `this`
        // `value` is `i`
        this.remove(value);
      }.bind(this, i));
    }
  },
  remove: function(index) {
  }
}

答案 1 :(得分:1)

借助ES2015功能:

ToDoList.prototype = {
  addListener() {
    for (let i = 0; i < ToDoList.counter; i++) {
      el.addEventListener("click", () => this.remove(i));
    }
  }
}

干嘛?

let将使循环的每次迭代都有自己的i,而不是整个函数的共享迭代。这解决了i等于ToDoList.counter的问题。

箭头功能=>会自动绑定,因此您无需担心this,它会自动正确绑定到外部this