事件处理程序的闭包 - 必须“返回”

时间:2011-02-17 15:02:59

标签: javascript closures

我可以通过两种方式在javascript中实现事件处理程序,如下所述,我想知道两种样式之间是否有任何区别,或者在两种情况下,click_handler都是一个闭包,并没有区别。我有困惑,因为我读到某个地方只有形成闭包然后“返回”与匿名函数一起使用

function foo() {
    var a = 5;

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

OR

function foo() {
    var a = 5;

    return function() {
        a++;
    }
}

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

2 个答案:

答案 0 :(得分:2)

创建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 :(得分:1)

只是为了明确地消除你的困惑:

闭包和return语句彼此无关,它们不会以任何方式影响彼此的行为。

闭包不是数字,字符串或函数之类的对象。例如,您永远不能为变量分配闭包。而且你不能返回关闭。你在第二个例子中返回的是(严格来说)一个函数(不是一个闭包),它在变量a上“关闭”(因此创建了一个闭包)。闭包是与您的功能一起存在的东西,但您从不直接操作它们。你可以使用包含它们的函数,或者你可以改变它们的状态(通过它们关闭的变量),但是闭包本身是一个更抽象的东西。

编辑:我确实意识到术语闭包和功能通常用于代替彼此。由于JavaScript中的两者之间存在1-1的关系,所以很容易混淆它。这当然只会增加混乱:)