Google Analytics跟踪代码如下所示:
(function() {
code
})();
他们使用这些括号的技术是什么 - (stuff)()
- 被称为?它做了什么?
我将Google Analytics代码放在我页面上的结束标记之前,然后像这样放一个if语句(我进一步包含了一个Jquery cookie插件):
<script type="application/javascript">
if ($.cookie('allowcookies') == 'yes') {
analytics code
}
</script>
直到我在代码周围使用相同的技术才开始运行:
(function() {if ($.cookie('allowcookies') == 'yes') {
analytics code
}
})();
为什么在我这样做之前没有运行?它为什么要追赶?
答案 0 :(得分:8)
(function() {
/* code */
}());
它通常被称为“自执行匿名函数(¹)”(o“立即函数调用”),其主要用途是避免在全局(或外部)范围内创建变量。
当你想创建一个只执行一次的函数时,它也可以用作快捷方式,而不需要先用自己的标识符定义函数,然后很快调用函数。
它最终可能会在范围内使用,如果外部上下文(或其他引用)通过参数传递绑定,它可能会创建一个闭包,例如
/* outer scope */
(function(outerscope) {
element.onsomeevent = function() {
/* do something with outerscope */
};
}(this));
我使用这个表达式的另一个实际用途是当我需要创建一个函数,以便在使用new
关键字调用它时很快在构造函数内执行(而不是显式调用某些init
方法)。
(¹) - 如Nicholas Zakas所写的“Mantainable Javascript”( O'Reilly,ISBN 978-1-449-32768-2 ) 44 ,建议的表达式为(function() {}())
,嵌套的parens(即使(function() {})()
仍然有用)
[...]显而易见的是,即时函数调用正在进行中,将 这些函数放在函数中[...]
答案 1 :(得分:3)
“function(){code}”部分只创建一个函数,最后的()调用创建的函数。 你可以重写
(function() {
code
})();
作为
var x = function() {code};
x();
答案 2 :(得分:1)
这只是一个选择呼叫功能。最后的()会自动调用它。
这样使用它来隔离仅与全局范围内的代码相关的局部变量。
例如:
(function() {
var x = 5;
window.y = 6;
})();
x仅在函数范围内可用,y通过窗口全局可用。
至于它没有运行,我认为这是你提供的条件。