Замыкания для обработчиков событий - это обязательное возвращение - PullRequest
3 голосов
/ 17 февраля 2011

Я могу реализовать обработчики событий в javascript двумя способами, как упомянуто ниже, я хотел бы знать, есть ли разница между двумя стилями или в обоих случаях click_handler является закрытием, и нет никакой разницы.У меня путаница, потому что я где-то читал, что замыкания образуются только тогда, когда «return» используется с анонимной функцией

function foo() {
    var a = 5;

    function click_handler() {
        a++;
    }
    someElement.addEventHandler('click', click_handler, false);
}

ИЛИ

function foo() {
    var a = 5;

    return function() {
        a++;
    }
}

click_handler = foo()
someElement.addEventListener('click', click_handler, false);

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Закрытие формируется при создании 2 функций. Функционально они должны работать одинаково с точки зрения «формирования замыкания». Вам не нужно возвращение для формирования закрытия.

Однако ...

В # 1, когда вы вызываете foo (), вы добавляете прослушиватель событий в onClick. Если вы будете вызывать его снова и снова и снова, он будет продолжать присоединяться к событию onClick ...

В # 2, когда вы вызываете foo (), вы просто «закрываете» функцию. Если вы вызываете его снова и снова, он не присоединится к событию onClick ...

И в # 1, если ссылка на someElement была обновлена ​​с тех пор, при повторном вызове foo () она будет использовать новую ссылку на someElement ...

Предполагая, что вы просто хотите присоединить функцию onClick один раз, и вам больше не придется ее повторно подключать, я напишу код, подобный этому ...

(function() {
  var a = 0;
  someElement.addEventListener("click", function() {
    a++;
  }, false);
})();

Эта автоматически выполняемая функция избавит от необходимости добавлять "foo" в глобальную переменную, поскольку вы используете его только один раз.

1 голос
/ 17 февраля 2011

Просто чтобы явно убить вашу путаницу:

Закрытия и оператор return не имеют ничего общего друг с другом, и они никак не влияют на поведение друг друга.

Закрытия не являются объектамикак числа, строка или функции.Например, вы никогда не можете назначить закрытие переменной.И вы не можете вернуть закрытие.Во втором примере вы возвращаете (строго говоря) функцию (не замыкание), которая «закрылась» над переменной a (и, следовательно, создала замыкание).Замыкания - это то, что существует наряду с вашими функциями, но вы никогда не работаете с ними напрямую.Вы можете работать с функциями, содержащими их, или вы можете изменять их состояние (через переменные, которые они закрывают), но само замыкание является более абстрактной вещью.часто используются вместо друг друга.Это легко перепутать, поскольку в JavaScript есть соотношение 1-1.Это, конечно, только добавляет путаницы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...