2012-02-13 8 views
8

Przepraszamy za opublikowanie tego, ale funkcja! Nie jest obsługiwana przez Google i nie znalazłem go w moim kodzie JavaScript.co oznacza funkcja? W JavaScript?

Oto jak Twitter wykorzystuje go:

<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> 

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

Odpowiedz

21

Jest krótki ręka lub alternatywa self-invoking anonymous function:

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

Może być napisane:

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

Można również użyć + zamiast !.

Jeśli po prostu tak:

function(){ 
    // code 
}(); 

To będzie powodować problemy, dlatego trzeba dodać ! przed którym okazuje deklarację funkcji w funkcji ekspresji.

Quoting docs, section 12.4:

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

Aby lepiej zrozumieć pojęcie, należy sprawdzić:

+0

Interesujące. Kiedy użyta jest anonimowa funkcja samopowstająca? Czym różni się od zwykłego wykonywania instrukcji wewnątrz? – netvope

+1

@netvope: Zobacz http://stackoverflow.com/questions/592396/what-is--celpose-of-a-self-executing-function-in-javascript – Sarfraz

+0

Rozumiem. Dzięki. Byłoby miło, gdyby JavaScript obsługiwał ustalanie zakresów za pomocą tylko nawiasów klamrowych (jak w C++) – netvope

2

oni negując wynik, a nie funkcja sama:

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

W rzeczywistości, jest to lekko ściśnięta forma:

(function(){}()) 

, ponieważ wymaga 1 mniej znaków. Powodem jest to, że nie można bezpośrednio wywołać deklaracji funkcji, np. to jest nieprawidłowy:

function(){}() 

ale dodanie ! na początku włącza go do funkcji expression i sprawia, że ​​działa.

+0

Interesująca technika ... –

+1

"negowanie wyniku" jest mylące, @ odpowiedź Twisola jest dokładniejsza –

+0

@ ŠimeVidas - Mam wrażenie, że jest to wygenerowany kod szukający samo-wywołujących wzorów funkcji, ponieważ zapisuje 1 znak :) –

2

To zazwyczaj wykorzystywane do obejścia dziwactwo w składni JavaScript. To daje błąd składni:

function() { 
}(); 

To odczytywać jako deklaracji funkcji (jak function foo() {}), zamiast wyrażenia funkcyjnego. Więc dodając! przed nim lub zawijanie go w nawiasach, zmusza analizator do zrozumienia, że ​​jest to wyrażenie.

+0

Nie jest to dziwactwo składni. To tylko składnia. –