Wiem, że istnieje kilka sposobów definiowania funkcji w JavaScript. Dwa z najczęstszych należą:Co się dzieje w JavaScript, gdy używam "tradycyjnej" deklaracji funkcji w stylu C?
(1) function add (a, b) {
return a + b;
}
(2) var add = function (a, b) {
return a + b;
}
jestem wygodne z ideą funkcji jako obiektu, który może zostać przekazany wokół podobnie jak każdej innej zmiennej. Rozumiem doskonale, co robi (2)
. Tworzy funkcję i przypisuje ją do add
(załóżmy, że jest to zakres globalny, więc add
jest zmienną globalną) wspomnianej funkcji. Ale co się dzieje, jeśli zamiast tego używam (1)
? Wiem już, że robi to różnicę w kolejności wykonywania: jeśli używam (1)
, mogę odnieść się do add()
przed punktem w kodzie, w którym zdefiniowano add()
, ale jeśli używam (2)
, muszę przypisać moją funkcję do add
, zanim będę mógł rozpocznij, odnosząc się do add()
.
Czy (1)
jest skrótem do (2)
, ale zachowuje się tak, jak inne języki w stylu C, pozwalając nam zdefiniować funkcję "poniżej" punktu, w którym jest używana? Czy jest wewnętrznie inny rodzaj funkcji? Który jest bardziej "w duchu" JavaScript (jeśli to nie jest zbyt niejasne określenie)? Czy ograniczyłbyś się do jednego lub drugiego, a jeśli tak, który?
Deklaracja funkcji w bloku instrukcji "if" jest błędem składni, zgodnie ze specyfikacją ECMAScript. Żadna z głównych przeglądarek nie zgłasza błędu, prawdopodobnie z powodu precedensu ustawionego przez IE i Mozillę. Mozilla obejmie go przez dodanie rozszerzenia do ECMAScript zwanego 'FunctionStatement' (http://www.jibbering.com/faq/#functionStatement, http://kangax.github.com/nfe/#function-statements). JScript ma mniej szacunku dla specyfikacji i wie, co Bóg wie. –
Komentarz do edycji: to prawda, że deklaracje funkcji są również określane jako instrukcje funkcji, ale niepoprawnie. Często zadawane pytania na temat comp.lang.javascript (powiązane z moim poprzednim komentarzem) bardzo wymownie brzmią: * "Określenie funkcji function zostało szeroko i niesłusznie użyte do opisania" FunctionDeclaration ". Jest to mylące, ponieważ w ECMAScript:" FunctionDeclaration " 'nie jest' Statement', są miejsca w programie, w których 'Statement' jest dozwolony, ale' FunctionDeclaration' nie jest. "* –
@Tim: Dzięki za interesujące komentarze. Nie wiedziałem o problemie nazewnictwa "oświadczenia". –