我正在尝试理解由Asp.Net Ajax Toolkit生成的脚本,该脚本目前正在提供"预期的对象"(如果我将PopupControlExtender放在更新面板中,则错误消失).
document.getElementById('ctl00_ValidationSummary1').dispose = function() { Array.remove(Page_ValidationSummaries, document.getElementById('ctl00_ValidationSummary1')); } (function() {var fn = function() {AjaxControlToolkit.ModalPopupBehavior.invokeViaServer('ctl00_c1_componentCategoryListUC_componentCategoryGrid_modalPopupExtender', true); Sys.Application.remove_load(fn);};Sys.Application.add_load(fn);})();
我在这里看到的是:
someobject.someevent = function() { dosth; } /* Get ready, I am about to do sth crazy ... */ (function() { dosth; })(); /* you did what? */
这个语法是什么意思?
编辑:我特别好奇(function(){...})()在另一个函数结束后立即出现}.
编辑:原来,ajax家伙忘了在事件处理程序分配后放置分号.
该
(function() { dosth; })();
语法声明一个匿名函数,然后立即执行它.这相当于这样做:
var myFun = (function() { dosth; }); myFun();
但没有临时变量.
从广义上讲,这类似于执行任何事情dosth
; 但是创建一个函数对象会为变量引入一个新的作用域(由于闭包),因此这通常用于解决与作用域有关的问题.
在你引用的具体案例中,我认为没有任何理由说明为什么这是特别必要的.然而,它可以这样做有两个原因 - 最终的Javascript本身是由一些自动过程生成的,无法判断是否需要闭包; 或者它是由一个人决定总是将功能包装在一起以保证安全.