2015-12-17 23 views
16

Widziałem to dziwne zachowanie w tej chwili, że nie mogę określićDlaczego funkcja() {} nie działa, ale (function() {}) działa? (Chrome DevTools/Node)

function(){} 

lub

function(a){ 
    console.log(a) 
} 

zgłasza .

Ale zadziałało test = function(){} lub (function(){}).

Narzędzia dev Safari mieć lepszy raport o błędzie: To mówi

SyntaxError: Function statements must have a name.

porządku to nie ma sensu, aby zdefiniować funkcję takiego, że jeśli nie będą go używać. Ale wciąż jest dziwne. Chyba już dostarczyłem odpowiedź w pytaniu.

+0

Zgadzam się, FF również jest w potrzebie nazwy funkcji z wyraźnym komunikatem o błędzie - SyntaxError: instrukcja funkcji wymaga nazwy – hazardous

+0

może dlatego, że nie możesz wykonać 'function() {}()' (jeśli nie używany jako argument), ale możesz zrobić '(function() {})()' – Hacketo

+0

Pierwsza jest niezdefiniowaną składnią funkcji, ale druga to obiekt – SaidbakR

Odpowiedz

28

JavaScript ma deklaracje funkcji i wyrażeń funkcji. Te pierwsze nie mogą być natychmiast przywołane, podczas gdy drugie może. To kwestia gramatyki języka.

deklaracja Funkcja:

function foo() { 
    // ... 
} 

wyrażenie Function (po prawej stronie na =):

var foo = function() { 
    // ... 
}; 

Dodając nawiasów wokół funkcji, jesteś zmuszając funkcję być przetwarzane jako wyrażenie funkcji, ponieważ nie można umieścić deklaracji funkcji w nawiasach (gdzie tylko wyrażenia są oczekiwane i akceptowane):

(function foo() { 
    // ... 
}); 

Można wtedy natychmiast powołać go:

(function foo() { 
    // ... 
})(); 

Dla bardziej szczegółowej write-up, sprawdź Function Definitions in JavaScript.

+2

Proszę zauważyć, że kanonicznym terminem jest * deklaracja funkcji *. "funkcja statement" znaczyło coś specjalnego przed ES6. – Bergi

+0

@Bergi Oczywiście, dzięki. Poprawione! –

9

Nawiasy w (function(){}) oznaczają, że funkcja ocenia, obiekt jest teraz zawarty w nawiasach, a ta ocena zwraca funkcję. Można go nazwać tak: (function(){})();.

function(){} nie podlega ocenie. Ma to sens, ponieważ powoduje to błąd, ponieważ, jak powiedziałeś, nie będziesz w stanie użyć go w żaden sposób.

Powiązane problemy