2014-02-22 101 views
2

我知道有在2点以下的方法有很大的区别:差异设置功能匿名

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

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

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

为什么Difference between onbeforeunload and onunload没有第一个人使用匿名和第二个使用正确的呢?

+9

谁使用第二种方法人是不成功的人。 – Pointy

+0

@Pointy说了些什么。第二种方法创建一个匿名函数,然后立即调用它并将结果(“未定义”)存储在'a.onclick'中。 – FrankieTheKneeMan

+0

因此,他们都是愚蠢的使用匿名电话来设置一个事件。谢谢! – Samul

回答

2

您可能会通过使用第一种方法获得想要的结果,即在对象aonclick字段中存储函数。

第二种情况存储该函数将调用,它返回undefined,所以它是等效的

a.onclick = undefined; 
4

之前有些时候,一个匿名,自动执行功能是事件处理程序是有用的。你的场景不是其中之一。

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

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

所以自执行函数本身返回一个适合作为onclick处理函数的函数。但是,它也有它自己的静态,它需要跟踪调用之间的关系。

这只是一个例子,说明为什么使用自动执行函数返回一个事件处理程序或其他回调槽的函数可能有用。

0

对于那些谁发现整个匿名函数事情不可读:

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

的jsfiddle:http://jsfiddle.net/stevenally/aXKL7/