2010-12-11 72 views
3

可能重複:
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(){}();javascript什麼是使用這樣的函數調用的目的(function(){// code;})();

嗨,

因爲我看只有簡單的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

與[圍繞JavaScript對象/函數/類聲明的括號是什麼意思? ](http://stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-objectfunctionclass-declaration)。 – 2010-12-11 08:13:11

+0

[這是什麼JavaScript語法的意思?](http://stackoverflow.com/questions/511096/what-does-this-javascript-syntax-mean)。 – outis 2010-12-11 08:14:51

+0

[在JavaScript中的Init函數的Dup和它的工作原理。](http://stackoverflow.com/questions/4212149/init-function-in-javascript-and-how-it-works) – outis 2010-12-11 08:21:28

回答

4

javascript的一個很酷的功能是匿名函數,這是它的一個例子。

使用匿名函數(又名一流的功能),可以將功能分配給變量並通過他們周圍的數據,這樣的:

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

在這個例子中,foo();基本上是同樣的事情,function(){return 4;}(); 。事實證明,這兩個都是有效的JavaScript,在這兩種情況下,這源於JavaScript中的函數是一流的。

這會打開很多cool possibilities。例如,您可以返回函數,函數作爲參數,等等。


編輯:在您的特定情況下,正在使用的匿名函數的原因是爲了保持使用的局部變量,避免unecessarily加入變量到周圍的命名空間。這類似於在C中創建{...}塊,或者在方案中編寫((lambda() ...))

+1

是的...它是一個匿名函數,但是您沒有真正描述立即調用無參數函數的目的。 – mpen 2010-12-11 08:19:58

+0

@Ralph:其他回答者已經說明了這一點,所以我沒有把它看成是必要的,但我想我可以爲了完整性而修正它。 (編輯:添加到答案) – Cam 2010-12-11 08:21:51

+0

你沒有提到它是一個「附加答案」;)*現在*你已經贏得了你的+1。 :p – mpen 2010-12-11 08:39:36

7

它限制了函數中聲明的變量的範圍,以避免拋棄全局名稱空間。

這是一個常見的良好做法,沒有什麼極端的。

+0

極端的意義上.. 。我沒有在其他編程語言中找到它,並且我無法猜測它可能是什麼。除此之外,我還提到了很多非凡的JavaScript選項。也許我應該使用另一項工作。無論如何謝謝你的評論。 – 2010-12-11 08:17:46

+0

稱爲「關閉」。 – mpen 2010-12-11 08:18:35

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> 

這將同樣的方式工作,但現在的變量gas是全局變量。如果其他人使用同樣簡短的非描述性變量名寫入其他代碼,那麼他們可能碰巧也會使用相同的變量。在這種情況下,它可能不會造成太多問題,但是您可能會有兩段代碼相互干擾,因爲其中一段代碼將s定義爲某種內容,然後另一段將其定義爲其他內容,並且它使調試非常棘手。

嘗試Google搜索「爲什麼全局變量不好?」瞭解更多信息。這種技術是避免創建全局變量的一種方法。

相關問題