Rozumiem przekazywanie funkcji do innej funkcji jako wywołanie zwrotne i zlecanie jej wykonania, ale nie rozumiem najlepszej implementacji do tego. Szukam bardzo podstawowego przykładu, takiego jak ten:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
W funkcji myFirstFunction, jeśli zwracam new callback (), to działa i wykonuje anonimową funkcję, ale wydaje mi się, że nie jest to właściwe podejście.
arguments
nie jest to tablica, nadal możesz odwołać się do jej długości jakoarguments.length
- spróbuj. Ta właściwość odnosi się do liczby faktycznie przekazanych argumentów, a niekoniecznie liczby parametrów w sygnaturze funkcji.Odpowiedzi:
Możesz po prostu powiedzieć
Alternatywnie możesz użyć tej
call
metody, jeśli chcesz dostosować wartośćthis
w wywołaniu zwrotnym.Wewnątrz funkcji
this
byłoby cokolwieknewValueForThis
jest.źródło
Powinieneś sprawdzić, czy callback istnieje i czy jest funkcją wykonywalną:
Wiele bibliotek (jQuery, dojo itp.) Używa podobnego wzorca dla swoich funkcji asynchronicznych, a także node.js dla wszystkich funkcji asynchronicznych (nodejs zwykle przekazuje
error
idata
do wywołania zwrotnego). Zajrzenie do ich kodu źródłowego mogłoby pomóc!źródło
callback
na string, a potem sprawdzasz jego typ? Czy to poprawi wydajność? Jest to podobne do sprawdzania typu, sprawdzania, czy przekonwertowana wartość logiczna zwraca wartość true, a następnie ponownego sprawdzania jej typu i porównywania z ciągiem znaków… Czy możesz wyjaśnić, dlaczego?typeof(callback)
osiągnąłbyś tego dla siebie?typeof(null) === "Object"
,typeof("undefined") === "undefined"
callback
nie jest rzutowany na ciąg, jego typ jest sprawdzany, aby sprawdzić, czy jest to funkcja, zanim zostanie wywołana. Kod przypuszczalnie akceptujecallback
jako argument i nie jest pewien, czy argument jest typu wywoływalnego - lub być może argumenty są różnego typu w celu zapewnienia formy polimorfizmu, w której kod mógłby różnie reagować na różnetypeof
argumenty.Istnieją 3 główne możliwości wykonania funkcji:
Wybrana metoda zależy od tego, czy:
Dokumenty dla funkcji Function.call , Function.apply
źródło
Wywołania zwrotne dotyczą sygnałów, a „nowy” dotyczy tworzenia instancji obiektów.
W tym przypadku byłoby jeszcze bardziej odpowiednie wykonanie po prostu „callback ()”; niż „return new callback ()”, ponieważ i tak nie robisz nic z wartością zwracaną.
(A arguments.length == 3 test jest naprawdę niezgrabny, fwiw, lepiej sprawdzić, czy parametr wywołania zwrotnego istnieje i jest funkcją.)
źródło
właściwa realizacja to:
dzięki temu parametr wywołania zwrotnego jest opcjonalny.
źródło
Możesz użyć:
Poniższy przykład jest trochę bardziej wszechstronny:
źródło
Oto podstawowy przykład wyjaśniający
callback()
funkcję w JavaScript:JSFiddle
źródło
źródło