2

Google Analytics 跟踪代码如下所示:

(function() {
code
  })();

他们对这些括号使用的技术是什么 - (stuff)()- 叫什么?它有什么作用?

我将 Google Analytics 代码放在页面的结束 head 标记之前,然后像这样在它周围放置一个 if 语句(我进一步包含了一个 Jquery cookie 插件):

<script type="application/javascript">
if ($.cookie('allowcookies') == 'yes') {
analytics code
}
</script>

直到我在我的代码中使用相同的技术,它才运行:

(function() {if ($.cookie('allowcookies') == 'yes') {

analytics code
}
})();

为什么在我这样做之前它没有运行?为什么追了?

4

3 回答 3

8
(function() {
   /* code */
}()); 

它通常被称为«自执行匿名函数 (¹)»(o «立即函数调用»),其主要用途是避免在全局(或外部)范围内创建变量。

当您想创建一个只执行一次的函数时,它也可以用作快捷方式,而无需先使用自己的标识符定义函数,然后很快进行函数调用。

它最终可能会在范围内使用,然后如果外部上下文(或其他引用)通过参数传递绑定,则它可能会创建一个闭包,例如

/* outer scope */  
(function(outerscope) {

   element.onsomeevent = function() {
       /* do something with outerscope */
   };

}(this));

我使用此表达式进行的另一个实际用途是,当我需要创建一个函数,以便在使用new关键字调用构造函数时(而不是显式调用某个init方法)在构造函数中执行该函数。


(¹) — 正如 Nicholas Zakas ( O'Reilly, ISBN 978-1-449-32768-2 ) 第44页的“Mantainable Javascript”一书中所述,建议的表达式是(function() {}()), 带有嵌套的括号(即使(function() {})()无论如何都可以使用)

[...]为了清楚地表明正在发生立即函数调用,请在函数周围加上括号[...]

另请参见立即函数调用语法

于 2012-09-04T08:43:50.563 回答
3

“function(){code}”部分只创建一个函数,最后的 () 调用创建的函数。你可以重写

(function() {
code
  })();

作为

var x = function() {code};
x();
于 2012-09-04T08:41:47.447 回答
1

它只是一个选择调用函数。最后的 () 导致它被自动调用。

像这样使用它来将仅与您的代码相关的局部变量与全局范围隔离。

例如:

(function() {

   var x = 5;
   window.y = 6;

})();

x 仅在函数范围内可用, y 通过窗口全局可用。

至于它没有运行,我冒险这取决于你提供的条件。

于 2012-09-04T08:40:51.627 回答