Был ли это правильный способ сделать закрытие для моей цели? - PullRequest
3 голосов
/ 15 марта 2012

Я постепенно все больше разбираюсь в замыканиях, и следующий код работает.Мне интересно, есть ли более простой / лучший способ выполнить то, что я пытаюсь сделать здесь.

В приведенном ниже коде this относится просто к объекту, который имеет свойство sectionsэто массив.Я зацикливаюсь на этом массиве и связываюсь с событием hover каждого свойства el (элемент DOM) каждого section.В обратном вызове, который я предоставляю методу 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)
        );
    };

Является ли это "правильным" способомчтобы написать это закрытие, или есть лучший способ?

1 Ответ

6 голосов
/ 15 марта 2012

Не создавайте функцию на лету, но поместите ее вне цикла 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]) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...