可能重复:
Is the following JavaScript construct called a Closure?
What do parentheses surrounding a JavaScript object/function/class declaration mean?
How does the (function() {})() construct work and why do people use it?
Difference between (function(){})(); and function(){}();
您好,
因为我正在查看一个只有简单的html文本而且没有图形的网站我想查看它的代码。
当我这样做时,我找到了这个脚本
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-13137273-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
使用以下
之类的代码有什么特殊目的(function() { /*code;*/ })();
我在jquery中看到过它。但是我仍然对极端javascript编程的自由风格感到不舒服。
建议,意见和解答。任何都会很好。
THX
[我在第一个答案后写这个。 在某种意义上的极端......我在其他编程语言中找不到它,而且我无法猜出它可能是什么。除了javascript中有很多非凡的选项,我提到它是极端的。也许我应该使用另一项工作。]
答案 0 :(得分:8)
假设他们这样做了:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-13137273-2']);
_gaq.push(['_trackPageview']);
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
</script>
这将以相同的方式工作,但现在变量ga
和s
是全局变量。如果其他人使用同样简短的,不需要的变量名称编写其他代码,他们可能也会使用相同的变量。在这种情况下,它可能不会引起太多问题,但是你可能会让这两段代码相互干扰,因为其中一条代码将s
定义为某种东西,然后另一条代码将其定义为其他东西,并且它使调试变得非常棘手。
尝试谷歌搜索“为什么全局变量不好?”欲获得更多信息。这种技术是一种避免创建全局变量的方法。
答案 1 :(得分:7)
它限制了函数内声明的变量的范围,以避免乱丢全局命名空间。
这是一种常见的良好做法,并没有什么极端的。
答案 2 :(得分:4)
javascript的一个很酷的功能是匿名功能,这就是它的一个例子。
使用匿名函数(也称为第一类函数),您可以将函数分配给变量并将其作为数据传递,如下所示:
var foo = function(){return 4;}
var x = foo(); //x=4
在该示例中,foo();
与function(){return 4;}();
基本相同。事实证明,这两者都是有效的javascript,在这两种情况下,这都源于javascript中的函数是一流的。
这会打开很多cool possibilities。例如,您可以返回函数,将函数作为参数传递等。
编辑:在您的特定情况下,使用匿名函数的原因是保持变量在本地使用,并避免不必要地将变量添加到周围的命名空间。这类似于在C中创建{...}
块,或在方案中编写((lambda () ...))
。