2012-02-13 88 views
8

對不起,發佈這個,但功能是不可谷歌,我沒有在我的JavaScript代碼中找到它。Javascript中的功能是什麼意思?

這是Twitter的是如何使用它:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://google.com" data-text="Google says">Tweet</a> 
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> 

https://twitter.com/about/resources/buttons#

回答

21

這是self-invoking anonymous function速記或替代:

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

可以寫成:

!function(){ 
    // code 
}(); 

您還可以使用+而不是!

如果你壓根兒:

function(){ 
    // code 
}(); 

這會產生問題,這就是爲什麼你需要添加!果然收到函數聲明函數表達式

Quoting docs, section 12.4:

An ExpressionStatement cannot start with the function keyword because that might make it ambiguous with a FunctionDeclaration.

爲了更好地理解這個概念,你應該檢查出:

+0

有趣。什麼時候自我調用匿名函數有用?與簡單執行裏面的語句有什麼不同? – netvope 2012-06-26 04:26:06

+1

@netvope:看到http://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Sarfraz 2012-06-26 06:06:45

+0

我明白了。謝謝。如果Javascript支持用大括號作爲範圍(如C++中的那樣) – netvope 2012-06-27 07:15:00

2

他們否定的結果,而不是本身的功能:

!function(x){ return x }(true); 
!true 
false 

在現實中,這是一個稍微壓縮的形式:

(function(){}()) 

因爲它需要少一個字符。它需要的原因是你不能直接調用函數聲明,例如這是無效的:

function(){}() 

,但在開始添加!把它變成一個功能expression並使其正常工作。

+0

有趣的技術... – 2012-02-13 20:12:22

+1

「否定結果」是誤導,@ Twisol的答案更準確 – 2012-02-13 20:14:19

+0

@ŠimeVidas - 我有一種感覺,這是生成的代碼尋找自調用函數模式,因爲它確實保存1個字符:) – 2012-02-13 20:14:25

2

它通常用來解決在JavaScript語法一個怪癖。這給出了一個語法錯誤:

function() { 
}(); 

它理解爲一個函數聲明(如function foo() {}),而不是函數表達式。所以加入!在它之前或用圓括號包裝它,迫使解析器理解它是一個表達式。

+0

這不是語法的怪癖。這只是語法。 – 2017-10-08 15:27:59

相關問題