2012-08-11 5 views
19

Possible Duplicate:
What does the exclamation mark do before the function?Po co używać operatora NOT w anonimowym wywołaniu funkcji? (A la Knockout 2.1.0)

Jeśli spojrzeć na source code for KnockoutJS 2.1.0 widać strukturę kodu takich jak to na początku linii 7:

!function(factory) { ... }(factoryDefinition); 

NOT operator powoduje to wyrażenie do oceny do true zamiast undefined, ale po co zawracać sobie głowę?

+0

Tak, wygląda na to, że mam takie samo pytanie, jak pytanie "wykrzyknik". Przepraszam, nie zauważyłem tego w moich poszukiwaniach. – CgodLEY

+0

@CgodLEY: Wyszukiwanie StackOverflow nie sprawdza się tak dobrze w interpunkcji i innych symbolach. Pomaga trochę to przeliterować. –

+0

Używasz go, aby wywołać natychmiastowe wywołanie funkcji, sprawiając, że wygląda ona jak wyrażenie, a nie instrukcja. – dakt

Odpowiedz

38

Jest to zwięzły sposób na sformułowanie natychmiastowego wyrażenia funkcji.

Tradycyjnie, ludzie używali tych dwóch form

(function(){ }()); // Recommended by Crockford 
(function(){ })(); // What most people use 

Jeśli próbujesz po prostu użyć

function(){ }(); // Syntax error 

będzie to błąd składni, ponieważ jest on interpretowany jako deklaracja funkcji raczej niż wyrażenie. Dlatego musisz zawinąć funkcję w nawiasach.

Ale jeśli umieścisz operatora jednoargumentowego przed deklaracją funkcji, nie musisz dodawać nawiasów klamrowych, i odetniesz jeden znak kodu, co jest (bardzo) niewielką korzyścią z wydajności. Istnieje kilka jednoargumentowych operatorów, których można używać do tego samego celu.

3

Bo jeśli tego nie zrobisz coś to wygląda na błąd składni:

function(factory) { ... }(factoryDefinition); 

Spróbuj.

Należy doprowadzić parser do punktu, w którym oczekuje on wyrażenia, aby słowo kluczowe function zostało rozpoznane w tym kontekście. W przeciwnym razie, gdy analizator składni widzi function jako pierwszy token w instrukcji, oczekuje prostej deklaracji funkcji i nie może być śledzona przez listę argumentów z nawiasami.

Istnieją różne alternatywy, wokół których skupiają się różne opinie.

+0

Próbowałem następujące wyrażenie na NodeJS i wydawało się po prostu w porządku, czy brakuje mi czegoś? 'function (message) {console.log (message)} ('hello');' result: 'hello' – CgodLEY

+0

@CgodLEY To nie działa w mojej konsoli węzła ... (Dane wyjściowe to' ... ') –

+0

Nie, Węzeł daje błąd składniowy. (W rzeczywistości dostaję go na otwartym polu w deklaracji funkcji, ponieważ deklaracja funkcji bez nazwy funkcji jest błędna – Pointy

Powiązane problemy