我有一个带有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循环中的所有值。
提前致谢
答案 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
。