这个 JavaScript 语法是什么意思?

4

我正在尝试理解由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个回答

5

The

(function() { dosth; })();

syntax声明一个匿名函数,然后立即执行它。这相当于执行以下操作:

 var myFun = (function() { dosth; });
 myFun();

但不使用临时变量。

大体上这与执行任何dosth相似;但是创建函数对象引入了一个新的变量作用域(由于闭包),因此通常用于解决作用域问题。

在你引用的具体情况中,我看不出为什么特别需要这样做。但出于两个原因可以这样做 - 要么最终的JavaScript是由某些自动化进程生成的,无法确定是否需要闭包; 要么它是由人类编写的,他决定始终将事物包装在函数中以确保安全。


2
(function() { dosth; })();

这里创建了一个匿名函数,然后立即调用。

这是在JavaScript中创建本地作用域的相对流行的习语,只有函数才能拥有自己的作用域。

本地作用域允许您拥有私有变量并避免名称冲突。

在其他语言中,您可以编写类似以下的代码

int a = 1;
{
   int b = 0;
   if (something){
       int c = 3;
   }
}

在JavaScript中,如果你想要一个新的作用域,你需要声明一个函数,这样这三个变量就会分别存在不同的作用域中。


1
(function() { dosth; })(); 

将dosth封装在匿名函数中,然后在页面加载时立即运行该匿名函数(这就是最后的()的作用)


它实际上会立即运行。这可能是在页面加载完成之前。 - meouw

0

假设你的意思是这样的:

(function() { dosth; })(); /* you did what? */

这在第一个括号块中声明了一个匿名函数,该函数将是由第二个括号块执行后返回的对象。

因此,这定义并执行了“dosth”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接