Jak przekazać funkcję jako parametr bez wykonywania funkcji w funkcji nadrzędnej lub używania eval()
? (Odkąd przeczytałem, że to niepewne.)
Mam to:
addContact(entityId, refreshContactList());
Działa, ale problem polega na tym, że refreshContactList
uruchamia się, gdy funkcja jest wywoływana, a nie wtedy, gdy jest używana w funkcji.
Mógłbym to obejść za pomocą eval()
, ale zgodnie z tym, co przeczytałem, nie jest to najlepsza praktyka. Jak mogę przekazać funkcję jako parametr w JavaScript?
javascript
function
parameters
imperium2335
źródło
źródło
addContact(1, function(id) { console.log(id); });
=
znaku ...class myFuncs {
zamiast tegoclass myFuncs = {
. Będziesz także musiał działać w środowisku, które obsługiwało składnię klas (jeszcze nie wszystkie przeglądarki ją obsługują). Jeśli nadal masz problemy, może lepiej pasować do zupełnie nowego pytania, ponieważ twoim problemem nie jest przekazywanie funkcji - jest to ogólna składnia ES.Jeśli chcesz przekazać funkcję, po prostu odwołaj się do niej po nazwie bez nawiasów:
Ale czasami możesz chcieć przekazać funkcję z dołączonymi argumentami , ale nie wywoływać jej dopóki nie zostanie wywołane wywołanie zwrotne. Aby to zrobić, wywołując go, po prostu zawiń w anonimową funkcję, taką jak ta:
Jeśli wolisz, możesz również użyć funkcji Apply i mieć trzeci parametr, który jest tablicą argumentów, na przykład:
źródło
Przykład 1:
Przykład 2:
Spójrz na to
źródło
Aby przekazać funkcję jako parametr, wystarczy usunąć nawiasy!
Chodzi o to, że funkcja jest dość podobna do zmiennej. Zamiast pisać
równie dobrze możesz pisać
Między nimi są niewielkie różnice, ale i tak - oba są prawidłowymi sposobami definiowania funkcji. Teraz, jeśli zdefiniujesz funkcję i wyraźnie przypiszesz ją do zmiennej, wydaje się całkiem logiczne, że możesz przekazać ją jako parametr do innej funkcji i nie potrzebujesz nawiasów:
źródło
typeof paramFunc == "function"
, bo jeśli nie można go wywołać, możesz go zignorować.Wśród programistów JavaScript jest takie zdanie: „Eval is Evil”, więc staraj się go unikać za wszelką cenę!
Oprócz odpowiedzi Steve'a Fentona możesz także przekazywać funkcje bezpośrednio.
źródło
Odciąłem wszystkie moje włosy tym problemem. Nie mogłem sprawić, by powyższe przykłady działały, więc skończyłem jak:
I to działa jak urok ... przynajmniej na to, czego potrzebowałem. Mam nadzieję, że to może pomóc.
źródło
Proponuję umieścić parametry w tablicy, a następnie podzielić je za pomocą
.apply()
funkcji. Teraz możemy łatwo przekazać funkcję z wieloma parametrami i wykonać ją w prosty sposób.źródło
Możesz także użyć
eval()
tego samego.Otóż to. Szukałem również tego rozwiązania i wypróbowałem rozwiązania podane w innych odpowiedziach, ale w końcu udało mi się to z powyższego przykładu.
źródło
Oto inne podejście:
źródło
W rzeczywistości wydaje się to trochę skomplikowane, nie jest.
pobierz metodę jako parametr:
Możesz podać jako metodę parametru:
źródło
Pozostałe odpowiedzi doskonale opisują, co się dzieje, ale jedną ważną „gotcha” jest upewnienie się, że wszystko, co przechodzi, jest rzeczywiście odniesieniem do funkcji.
Na przykład, jeśli przejdziesz przez ciąg zamiast funkcji, otrzymasz błąd:
Zobacz JsFiddle
źródło
Kiedyś musisz poradzić sobie z obsługą zdarzeń, więc musisz przekazać zdarzenie jako argument, większość współczesnej biblioteki reaguje, angular może tego potrzebować.
Muszę zastąpić funkcję OnSubmit (funkcję z biblioteki innej firmy) za pomocą niestandardowego sprawdzania poprawności w reakjs i przekazałem funkcję i zdarzenie, jak poniżej
PIERWOTNIE
STWORZYŁA Nową FUNKCJĘ
upload
ionSubmit
jako argumenty wywołała pass i eventźródło
Możesz także użyć JSON do przechowywania i wysyłania funkcji JS.
Sprawdź następujące:
Spowoduje to wydrukowanie „a”.
Poniższe ma taki sam efekt z powyższym:
Który ma również ten sam efekt z następującymi:
I paradygmat obiektu wykorzystujący klasę jako prototyp obiektu:
źródło