我可以命名一个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和它的live
和delegate
函数都可以让你指定使用全部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; })();