Jaka jest zaleta przypisywania funkcji do var?


Odpowiedzi:


8

Krótka odpowiedź, moim zdaniem, polega po prostu na tym, że tworzysz anonimową funkcję przypisaną do zmiennej, w przeciwieństwie do tworzenia nazwanej funkcji z ...

    function sum() {}

Dobrym sposobem na sprawdzenie różnic jest wywołanie .ToString () na nich i zobaczenie różnicy, lub możesz zrobić console.log (sum.name). Jeden poda rzeczywistą nazwę, a drugi nic, a mianowicie funkcję anonimową (tę przypisaną do var). Są też pewne szczegóły, takie jak var sum = function () {} zostaje zdefiniowane w czasie wykonywania, a funkcja sum () {} zostaje zdefiniowana w czasie analizy.


Rozumiem przez ostatnie zdanie, że jeśli spróbujesz wywołać sum () w poprzednim wierszu powyżej, w którym został zdefiniowany przez var, wtedy wystąpi błąd. Jeśli jest zdefiniowane jak w mojej odpowiedzi, nie byłoby błędu, nawet gdyby wywołanie było powyżej funkcji.
harmonickey

12
To wyjaśnia różnicę , ale nie sądzę, żeby wyjaśniała przewagę .
Keith Thompson,

jaka jest różnica między czasem analizy a czasem wykonywania?
Wern Ancheta

1
Nie ma to nic wspólnego z nazwanymi funkcjami, nadal możesz przypisać nazwaną funkcję do zmiennej
Juan Mendes 10.04.13

5

Jedną z zalet jest to, że nie można użyć deklaracji funkcji w bloku. Mogą znajdować się tylko na najwyższym poziomie pliku lub bezpośrednio w innej funkcji.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Wszystkie te nie są określone przez standard, a przeglądarki robią różne rzeczy, patrz /programming/10069204/function-declarations-inside-if-else-statements . Jeśli więc musisz czasem używać innego stylu, dla zachowania spójności możesz chcieć to zawsze robić

Nie jestem tego pewien, ale jeśli dobrze pamiętam, niektóre stare minizestawy nie były wystarczająco inteligentne, aby obsłużyć deklaracje funkcji i nie zmieniać ich nazw.


3

Nie jestem ekspertem od Javascript, więc weź to z odrobiną soli. Myślę, że w niektórych przypadkach ludzie mogą to robić ze względu na styl i to samo można osiągnąć, pisząc „function sum () {...}”

Jednak przypisanie funkcji do zmiennej jest bardzo skuteczną techniką programowania funkcjonalnego. Jeśli znasz OOP, jest on nieco podobny do polimorfizmu. Pomyśl o klasycznym przykładzie klasy bazowej Animal i klasach Cat / Dog. Możesz pisać kod, który działa ze Animalem, ale gdy wywołuje funkcję, funkcja ta może wykonywać inną pracę w zależności od typu instancji.

W programowaniu funkcjonalnym możesz mieć algorytm, który działa z „funkcją”, ale jeśli używasz zmiennej do wywołania tej funkcji, masz swobodę przypisywania innej funkcji w czasie wykonywania.

Załóżmy na przykład, że piszesz algorytm prezentujący 10 000 punktów danych w oknie o średnicy zaledwie 500 pikseli. Każdy piksel będzie wtedy reprezentował 20 punktów danych, a aby je przedstawić, musisz agregować te 20 punktów danych w jedną wartość.

Powiedzmy, że definiujesz algorytm prezentujący 10 000 punktów, a ten algorytm używa zmiennej funkcyjnej zwanej agregacją, tak jak poniżej:

...
displayValue = aggregate( numbersInOnePixel );
...

Teraz w środowisku wykonawczym użytkownik może wybrać sposób agregowania danych. Rzeczywista zmienna funkcji może być jedną z następujących czynności:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}

0

Jest to głównie kwestia stylu, ponieważ jedyne sytuacje, w których pojawia się różnica (wywołanie niektórych funkcji przed zakończeniem wszystkich deklaracji; przy użyciu metody toString), są w moim przypadku rodzajem przypadków narożnych.

Jednym z argumentów, które słyszałem, wspierając ten var =styl, jest to, że jest on zgodny z tym, jak deklarujesz normalne zmienne. Ogranicza to liczbę używanych przez Ciebie funkcji językowych i upraszcza wprowadzanie programu w kogoś nowego w Javascript.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.