javascript使用这样的函数调用的目的是什么(function(){// code;})();

javascript what is the purpose of using a function call like this (function() { //code; })();

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
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文本的站点而没有图形我想到查看它的代码。

当我这样做时,我找到了这个脚本

1
2
3
4
5
6
7
8
9
10
11
<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);
  })();

使用如下代码有什么特殊目的

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

我在jquery中看到过它。 但我对自由风格的极端JavaScript编程仍然不太满意。

建议,意见和答案。 任何都会很好。

谢谢

[我在第一个答案后写这个。 在某种意义上的极端......这是我在其他编程语言中找不到的,而且我无法猜到它可能是什么。 除了javascript中有很多非凡的选项,我提到它是极端的。 也许我应该用另一部作品。]


假设他们这样做了:

1
2
3
4
5
6
7
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);

这将以相同的方式工作,但现在变量gas是全局变量。如果其他人使用同样简短的,不需要的变量名称编写其他代码,他们可能也会使用相同的变量。在这种情况下,它可能不会引起太多问题,但是你可能会让两段代码互相干扰,因为其中一条代码将s定义为某种东西,然后另一条代码将其定义为其他东西,它会使调试非常棘手。

尝试谷歌搜索"为什么全局变量不好?"欲获得更多信息。该技术是一种避免创建全局变量的方法。


它限制了函数内声明的变量的范围,以避免乱丢全局命名空间。

这是一种常见的良好做法,并没有什么极端的。


javascript的一个很酷的功能是匿名函数,这就是它的一个例子。

使用匿名函数(也称为第一类函数),您可以将函数分配给变量并将其作为数据传递,如下所示:

1
2
var foo = function(){return 4;}
var x = foo(); //x=4

在该示例中,foo();function(){return 4;}();基本相同。事实证明,这两者都是有效的javascript,在这两种情况下,这都源于javascript中的函数是一流的。

这开辟了许多很酷的可能性。例如,您可以返回函数,将函数作为参数传递等。

编辑:在您的特定情况下,使用匿名函数的原因是保持变量在本地使用,并避免不必要地将变量添加到周围的命名空间。这类似于在C中创建{...}块,或者在scheme中编写((lambda () ...))