我可以通过两种方式在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);
答案 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
上“关闭”(因此创建了一个闭包)。闭包是与您的功能一起存在的东西,但您从不直接操作它们。你可以使用包含它们的函数,或者你可以改变它们的状态(通过它们关闭的变量),但是闭包本身是一个更抽象的东西。