Javascript 将函数设置为匿名函数的区别

Javascript 将函数设置为匿名函数的区别,javascript,function,events,Javascript,Function,Events,我知道以下两种方法有很大区别: a.onclick = function() {alert("Hi");}; 及 为什么人们使用第二种方法?第二个应该在页面加载时触发alert(),但不会 为什么第一个人使用匿名而第二个人使用正确的方法?使用第一种方法,即在对象a的onclick字段中存储函数,您可能会得到想要的结果 存储前的第二种情况调用该函数,该函数返回undefined,因此它相当于 a.onclick = undefined; 有时,匿名、自动执行的函数对事件处理程序很有用。你的场景

我知道以下两种方法有很大区别:

a.onclick = function() {alert("Hi");};

为什么人们使用第二种方法?第二个应该在页面加载时触发alert(),但不会


为什么第一个人使用匿名而第二个人使用正确的方法?

使用第一种方法,即在对象
a
onclick
字段中存储函数,您可能会得到想要的结果

存储前的第二种情况调用该函数,该函数返回
undefined
,因此它相当于

a.onclick = undefined;

有时,匿名、自动执行的函数对事件处理程序很有用。你的场景不是其中之一

这里有一个例子。在本例中,我使用一个作用域变量来跟踪处理程序被调用的次数,但为了防止该变量泄漏到外部作用域,它必须位于函数中;但是为了在事件处理程序调用中持久化该值,它不能在处理程序本身中初始化——它需要绑定在闭包中

a.onclick = (function () {
    var counter = 0;
    return function (e) {
        ++counter;
        alert("Hi! This handler has been invoked " + counter + " times!");
    };
}());
因此,自执行函数本身返回一个适合作为onclick处理程序的函数。但是,它也有自己的静态状态,即使在调用之间也需要跟踪


这只是使用自执行函数返回事件处理程序或其他回调槽的函数可能有用的一个示例。

对于那些发现整个匿名函数都不可读的人:

a.onclick = a_onclick;
var counter = 0;
function a_onclick()
{
  counter++;
  alert("Hi! This handler has been invoked " + counter + " times!");
}

jsfiddle:

使用第二种方法的人都是不成功的人。@Pointy说了什么。第二种方法创建一个匿名函数,然后立即调用它,并将结果(未定义的
a.onclick
)存储在
a.onclick中。因此,使用匿名调用来设置事件都是愚蠢的。非常感谢。除非匿名函数返回一个函数,否则你链接的帖子中的代码是不完整的,一个完整的表单几乎可以做任何事情。
a.onclick = a_onclick;
var counter = 0;
function a_onclick()
{
  counter++;
  alert("Hi! This handler has been invoked " + counter + " times!");
}