在 for 循环中将 Bind 添加到原版 Javascript 中的原型对象

Adding Bind to a prototyped object in vanilla Javascript in a for loop

本文关键字:Javascript 原版 原型 对象 添加 for 循环 Bind      更新时间:2023-09-26

我有一个Javascript类,它有一个原型方法,它使用for循环将事件侦听器添加到一组对象中并调用类中的另一个方法。

为了能够访问类中的另一个方法,我

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

    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 循环中的所有值。

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) {
  }
}

具有 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