我越来越慢地理解闭包,以下代码可以正常工作。我想知道是否有更简单/更好的方法来完成我在这里尝试做的事情。
在下面的代码中,this
仅指一个对象,它具有一个sections
属性是一个数组。我遍历这个数组,并绑定到每个el
的每个section
属性(一个DOM元素)的悬停事件。我提供给hover()
方法的回调是闭包的来源。主this
对象有两个方法.sectionMouseenter()
和.sectionMouseleave()
根据事件类型被调用(在我的代码中由e.type
表示)是mouseenter
或mouseleave
。作为参数,当前部分将传递给这些方法。当然,for
循环的迭代在JavaScript中没有变量范围,因此需要一个闭包来封装section
变量的引用。
for (var i = this.sections.length - 1; i >= 0; i--) {
var section = that.sections[i];
section.el.hover(
(function(section){
return function(e){
that['section' + e.type.capitalize()](section);
}
})(section)
);
};
这是编写此闭包的“正确”方法,还是有更好的方法?
答案 0 :(得分:6)
不要动态构造函数,而是将它放在for循环之外。
var sections = this.sections;
function dummy(section) {
return function(e) {
that['section' + e.type.capitalize()](section);
}
}
for (var i = sections.length - 1; i >= 0; i--) {
section.el.hover( dummy(sections[i]) );
}