我正在尝试理解由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家伙忘记在事件处理程序分配后放置分号。
答案 0 :(得分:5)
在
(function() { dosth; })();
语法声明一个匿名函数,然后立即执行它。这相当于这样做:
var myFun = (function() { dosth; });
myFun();
但没有临时变量。
从广义上讲,这类似于执行dosth
所做的任何事情;但是创建一个函数对象会为变量引入一个新的范围(由于闭包),因此这通常用于处理范围问题。
在您引用的具体案例中,我认为没有任何理由说明为什么这是特别必要的。然而,它可以这样做有两个原因 - 最终的Javascript本身是由一些自动过程生成的,无法判断是否需要闭包;或者它是由一个决定永远把事物包裹起来以保证安全的人写的。
答案 1 :(得分:2)
(function() { dosth; })();
这里创建一个匿名函数,然后立即调用。
这是在JavaScript中创建本地范围的相对流行的习惯用法,其中只有函数有自己的范围。
本地范围允许您拥有私有变量并避免名称冲突。
在其他语言中,您可以编写类似
的内容int a = 1;
{
int b = 0;
if (something){
int c = 3;
}
}
并且这三个变量都在不同的范围内,但在JavaScript中你必须这样做 声明一个函数来获得一个新的范围。
答案 2 :(得分:1)
(function() { dosth; })();
在一个匿名函数中包装dosth,然后在页面加载后立即运行该匿名函数(这就是那些final()所做的事情)
答案 3 :(得分:0)
假设你是这个意思:
(function() { dosth; })(); /* you did what? */
这在第一个parens块中声明了一个匿名函数,该函数将是第二个paren块执行的paren块的返回对象。
所以这定义并执行“dosth”是什么。