我可以命名一个JavaScript函数并立即执行它?

我有很多这样的:

function addEventsAndStuff() { // bla bla } addEventsAndStuff(); function sendStuffToServer() { // send stuff // get HTML in response // replace DOM // add events: addEventsAndStuff(); } 

重新添加事件是必要的,因为DOM已经改变,所以之前附加的事件不见了。 因为他们也必须最初附加(杜),他们在一个很好的function是干的。

这个设置没有什么问题(或者是否存在?),但是我可以平滑一点吗? 我想创buildaddEventsAndStuff函数,并立即调用它,所以它看起来不像是一个非常有趣的东西。

以下两种语法错误都会响应:

 function addEventsAndStuff() { alert('oele'); }(); (function addEventsAndStuff() { alert('oele'); })(); 

任何接受者?

你在问题中发布的例子没有什么问题。另一种做法可能看起来很奇怪,但是:

 var addEventsAndStuff; (addEventsAndStuff = function(){ // add events, and ... stuff })(); 

有两种方法可以在JavaScript中定义一个函数。 函数声明:

 function foo(){ ... } 

和一个函数expression式,它是定义除上述以外的函数的任何方式:

 var foo = function(){}; (function(){})(); var foo = {bar : function(){}}; 

…等等

函数expression式可以被命名,但是它们的名字不会被传播到包含的范围。 这个代码的含义是有效的:

 (function foo(){ foo(); // recursion for some reason }()); 

但是这不是:

 (function foo(){ ... }()); foo(); // foo does not exist 

所以为了命名你的函数并立即调用它,你需要定义一个局部variables,把它作为一个expression式来赋值,然后调用它。

这个设置没有什么问题(或者是否存在?),但是我可以平滑一点吗?

请看使用事件委托。 那就是你真正注意到容器上的事件的地方,然后使用event.target (或IE上的event.srcElement )来确定事件实际发生的位置并正确处理。

这样,你只附加处理程序(s)一次,即使你换出内容,他们只是继续工作。

以下是不使用任何助手库的事件委托的例子:

 (function() { var handlers = {}; if (document.body.addEventListener) { document.body.addEventListener('click', handleBodyClick, false); } else if (document.body.attachEvent) { document.body.attachEvent('onclick', handleBodyClick); } else { document.body.onclick = handleBodyClick; } handlers.button1 = function() { display("Button One clicked"); return false; }; handlers.button2 = function() { display("Button Two clicked"); return false; }; handlers.outerDiv = function() { display("Outer div clicked"); return false; }; handlers.innerDiv1 = function() { display("Inner div 1 clicked, not cancelling event"); }; handlers.innerDiv2 = function() { display("Inner div 2 clicked, cancelling event"); return false; }; function handleBodyClick(event) { var target, handler; event = event || window.event; target = event.target || event.srcElement; while (target && target !== this) { if (target.id) { handler = handlers[target.id]; if (handler) { if (handler.call(this, event) === false) { if (event.preventDefault) { event.preventDefault(); } return false; } } } else if (target.tagName === "P") { display("You clicked the message '" + target.innerHTML + "'"); } target = target.parentNode; } } function display(msg) { var p = document.createElement('p'); p.innerHTML = msg; document.body.appendChild(p); } })(); 

现场示例

请注意,如果单击dynamic添加到页面的消息,即使没有代码在要添加的新段落上挂钩事件,也会注册并处理您的点击。 还要注意你的处理程序是如何在地图中input的,而你在document.body上有一个处理程序来完成所有的调度。 现在,你可能会把它放在比document.body更有针对性的东西上,但是你明白了。 另外,在上面我们基本上是通过id来调度,但是你可以按照你喜欢的方式进行复杂或简单的匹配。

像jQuery , Prototype , YUI , Closure或其他任何一个的现代JavaScript库应该提供事件委托function来平滑浏览器的差异,并干净地处理边缘情况。 当然,jQuery和它的livedelegate函数都可以让你指定使用全部CSS3select器的处理程序(然后是一些)。

例如,下面是使用jQuery的等效代码(除非我确定jQuery处理边缘情况,上面的非原始版本没有):

 (function($) { $("#button1").live('click', function() { display("Button One clicked"); return false; }); $("#button2").live('click', function() { display("Button Two clicked"); return false; }); $("#outerDiv").live('click', function() { display("Outer div clicked"); return false; }); $("#innerDiv1").live('click', function() { display("Inner div 1 clicked, not cancelling event"); }); $("#innerDiv2").live('click', function() { display("Inner div 2 clicked, cancelling event"); return false; }); $("p").live('click', function() { display("You clicked the message '" + this.innerHTML + "'"); }); function display(msg) { $("<p>").html(msg).appendTo(document.body); } })(jQuery); 

实时复制

您的代码包含一个错字:

 (function addEventsAndStuff() { alert('oele'); )/*typo here, should be }*/)(); 

所以

 (function addEventsAndStuff() { alert('oele'); })(); 

作品。 干杯!

基于评论:这应该运行并一次返回函数:

 var addEventsAndStuff = ( function(){ var addeventsandstuff = function(){ alert('oele'); }; addeventsandstuff(); return addeventsandstuff; }() ); 

有一个很好的速记(不需要声明任何variables栏的function分配):

 var func = (function f(a) { console.log(a); return f; })('Blammo') 

你可能想要像这样创build一个辅助函数:

 function defineAndRun(name, func) { window[name] = func; func(); } defineAndRun('addEventsAndStuff', function() { alert('oele'); }); 

如果你想创build一个函数并立即执行 –

 // this will create as well as execute the function a() (a=function a() {alert("test");})(); // this will execute the function a() ie alert("test") a(); 

试着这样做:

 var addEventsAndStuff = (function(){ var func = function(){ alert('ole!'); }; func(); return func; })();