Coraz więcej widzę, jak funkcje są deklarowane jak
var foo = function() {
// things
};
Zamiast tego, jak się nauczyłem
function foo() {
// things
}
Co za różnica? Lepsza wydajność? Zakres? Czy powinienem używać tej metody?
javascript
functions
Steve Robbins
źródło
źródło
Odpowiedzi:
var foo = function() {}
definiuje zmienną, która odwołuje się do funkcji anonimowej.function foo() {}
definiuje nazwaną funkcjęfoo
.Każda z nich może zostać przekazana przez nazwę jako parametry funkcji i może zostać utworzona instancja, jeśli zamierzone użycie dotyczy OOP.
Na koniec dnia, którego używasz, jest w dużej mierze podyktowane konkretnym przypadkiem użycia (Javascript jest taki zabawny;)). Jeśli w końcu użyjesz tego pierwszego, zdecydowanie sugeruję, abyś nazwał funkcję:
var foo = function MY_function() {}
. Ta konwencja nazewnictwa pomaga, aby zestaw wywołań debuggera nie był bezużyteczny.źródło
foo
i wywoływana jest funkcjaMY_function
wyrażenie funkcji:
Wyrażenie func w tym przypadku jest anonimowe, ale przypisane do var dla odniesienia. Różni się to od instrukcji funkcji oznaczonej etykietą w następujący sposób:
new someFunction().constructor.name === 'someFunction';//false
instancje nie otrzymują nazwy zmiennej dla konstruktora.nazwa, ponieważ odwołanie do funkcji jest przypisane do zmiennej, ale zmienna, a nie funkcja, jest powiązana z nazwą zmiennejW oznaczonej instrukcji funkcji:
new someFunction().constructor.name === 'someFunction'; //true
nazwa jest bezpośrednio powiązana z funkcją.Ogólnie rzecz biorąc, nie ma naprawdę wielkiego powodu, aby używać wyrażenia do var, chyba że chcesz, aby wywołania kończyły się niepowodzeniem, jeśli sprawy się zmieniają lub definiujesz / przypisujesz metodę w jednej linii. Uważam, że podnoszenie jest przydatne do organizowania obiektów z wewnętrznymi funkcjami i definicjami metod na dole, dzięki czemu mogę przejść do faktycznego zachowania obiektu i wykonać jednowierszowe definicje metod publicznych (po prostu przypisując funcs do
this.
tej samej nazwy) wszystko w jednym miejsce dla ułatwienia odniesienia. Zawsze powinieneś próbować używać oznaczonych instrukcji dla konstruktorów, IMO, abyś mógł zidentyfikować „typ” obiektu za pomocą jego konstruktora.źródło
Twój pierwszy przykład jest wyrażeniem, a drugi przykład jest wyrażeniem . Definiowanie funkcji jako wyrażeń pozwala na większą elastyczność w tym, gdzie może wystąpić definicja, do czego można ją przypisać, że można przekazać ją jako parametr itp.
Na przykład:
vs...
Bardziej złożone przykłady stałyby się nieprzyzwoicie skomplikowane bez składni wyrażenia funkcji.
Spójrz na https://stackoverflow.com/questions/111102/how-do-javascript-closures-work
źródło
Główną praktyczną różnicą jest podnoszenie. Na przykład:
vs
Jest to również niezdefiniowane zachowanie
podczas gdy to jest w porządku.
źródło
if
instrukcji!