这个javascript语法是什么意思?

时间:2009-02-04 12:14:09

标签: javascript syntax

我正在尝试理解由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家伙忘记在事件处理程序分配后放置分号。

4 个答案:

答案 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”是什么。