这是为我的目的制作封闭的正确方法吗?

时间:2012-03-15 13:56:02

标签: javascript jquery closures

我越来越慢地理解闭包,以下代码可以正常工作。我想知道是否有更简单/更好的方法来完成我在这里尝试做的事情。

在下面的代码中,this仅指一个对象,它具有一个sections属性是一个数组。我遍历这个数组,并绑定到每个el的每个section属性(一个DOM元素)的悬停事件。我提供给hover()方法的回调是闭包的来源。主this对象有两个方法.sectionMouseenter().sectionMouseleave()根据事件类型被调用(在我的代码中由e.type表示)是mouseentermouseleave。作为参数,当前部分将传递给这些方法。当然,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)
        );
    };

这是编写此闭包的“正确”方法,还是有更好的方法?

1 个答案:

答案 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]) );
}