我知道下面两种方法有很大的不同:
a.onclick = function() {alert("Hi");};
和
a.onclick = (function() {alert("Hi");};)();
为什么人们使用第二种方法?第二个应该在页面加载时触发alert()但不是吗?
为什么在Difference between onbeforeunload and onunload中第一个人使用匿名而第二个使用正确的人?
答案 0 :(得分:4)
有时,匿名的自执行函数对事件处理程序很有用。您的方案不是其中之一。
这是一个例子。在这个例子中,我使用一个范围变量来跟踪调用处理程序的次数,但是为了防止该变量泄漏到外部范围,它必须在一个函数中;但是为了在事件处理程序调用之间保持值,它不能在处理程序本身中初始化 - 它需要绑定在闭包中。
a.onclick = (function () {
var counter = 0;
return function (e) {
++counter;
alert("Hi! This handler has been invoked " + counter + " times!");
};
}());
因此,自执行函数本身返回一个适合作为onclick处理程序的函数。但是,它也有自己的静态状态,即使在调用之间也需要跟踪它。
这只是为什么使用一个为事件处理程序或其他回调槽返回函数的自执行函数可能有用的一个例子。
答案 1 :(得分:2)
您可能会使用第一种方法获得所需内容,即在对象onclick
的{{1}}字段中存储函数。
存储之前的第二种情况调用该函数,该函数返回a
,因此它相当于
undefined
答案 2 :(得分:0)
对于那些发现整个匿名函数不可读的人:
a.onclick = a_onclick;
var counter = 0;
function a_onclick()
{
counter++;
alert("Hi! This handler has been invoked " + counter + " times!");
}