Jak rozpoznać, czy funkcja w JavaScript jest zdefiniowana?
Chcę zrobić coś takiego
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Ale to mnie rozumie
oddzwanianie nie jest funkcją
błąd, gdy wywołanie zwrotne nie jest zdefiniowane.
javascript
reflection
Aaron Lee
źródło
źródło
Wszystkie obecne odpowiedzi używają dosłownego ciągu, którego wolę nie mieć w kodzie, jeśli to możliwe - to nie (i zapewnia cenne znaczenie semantyczne, aby uruchomić):
Osobiście staram się zmniejszyć liczbę ciągów znaków w moim kodzie ...
Ponadto, chociaż zdaję sobie sprawę, że
typeof
jest to operator, a nie funkcja, korzystanie ze składni, która sprawia, że wygląda ona na tę drugą, jest niewielkie.źródło
isFunction(not_defined))
gdzienot_defined
jest nazwa funkcji, która nie jest zdefiniowana i FireBug zwrócił,not_defined is not defined
co jest poprawne, ale twoja funkcja powinna zwrócić wartość false i nie generować błędu ...not_defined
, aby przekazać jego wartośćisFunction()
i nie może go rozwiązać. Nic nie można zrobić z definicjąisFunction()
rozwiązania tego problemu.isFunction
i rób tylko(typeof no_function == typeof Function)
.typeof(Function())
ponieważ Function jest funkcją; ale podobnie jak Array, Object i inne wbudowane prototypy (z braku lepszego terminu). Jeśli sprawdzałeś tablicę, którejtypeof(array) === typeof(Array)
na przykład nie używałbyś ; użyjesz tego,typeof(array) === typeof(Array())
ponieważ faktycznie musisz ocenić funkcję, jeśli jesteś ostrożny i konsekwentny.Należy zauważyć, że wywołania zwrotnego (przez siebie) ma wartość
false
, jeśli jestundefined
,null
,0
, lubfalse
. Porównywanie donull
jest zbyt specyficzne.źródło
callback
sama wartość ma wartość „fałsz-y”, to jej typof nigdy nie może być „funkcją”.Te metody określania, czy funkcja jest zaimplementowana, również zawodzą, jeśli zmienna nie jest zdefiniowana, dlatego używamy czegoś mocniejszego, który obsługuje otrzymywanie łańcucha:
źródło
typeof window.doesthisexist
zamiastdoesthisexist
. Jednak użycie eval (która: jest zła), jak pokazano, będzie działać tylko z nazwanymi funkcjami - nie działałoby to w przypadku użycia w pytaniu.Nowość w JavaScript Nie jestem pewien, czy zachowanie się zmieniło, ale rozwiązanie podane przez Jasona Buntinga (6 lat temu) nie będzie działać, jeśli to możliwe Funkcja nie jest zdefiniowana.
Spowoduje to wygenerowanie
ReferenceError: possibleFunction is not defined
błędu, gdy silnik spróbuje rozwiązać możliwy symbol Funkcja (jak wspomniano w komentarzach do odpowiedzi Jasona)Aby uniknąć tego zachowania, możesz przekazać tylko nazwę funkcji, którą chcesz sprawdzić, czy istnieje. Więc
Ustawia zmienną na funkcję, którą chcesz sprawdzić, lub pusty obiekt, jeśli nie jest zdefiniowany, dzięki czemu unika się wyżej wymienionych problemów.
źródło
Próbować:
źródło
źródło
źródło
if(typeof Function === typeof callback)...
? :)typeof
coś innego (być może „Funkcja” zamiast „funkcja”), z powodu nowej / innej implementacji JavaScript - wydaje się , że mniej prawdopodobne jest, że nowa / inna implementacja złamałabytypeof Function === typeof callback
kontrolę, ponieważ powinna być taka sama na poziomie semantycznym.źródło
mogę zrobić
Wiem, że istnieje akceptowana odpowiedź, ale nikt tego nie sugerował. Nie jestem do końca pewien, czy pasuje to do opisu idiomatic, ale działa we wszystkich przypadkach.
W nowszych silnikach JavaScript
finally
można zamiast tego użyć.źródło
typeof callback
tak zwykle używam .accepted_types.indexOf(typeof value) !== -1
czy jest w zakresie typów. W tej sytuacji wyjątki byłyby moim zdaniem wygórowane.Spróbuj tego:
źródło
Jeśli spojrzysz na źródło biblioteki @Venkat Sudheer Reddy Aedama wspomniane, underscorejs, możesz zobaczyć:
To tylko moja WSKAZÓWKA, WSKAZÓWKA odpowiedź:>
źródło
Próbować:
źródło
Jeśli używasz http://underscorejs.org , masz: http://underscorejs.org/#isFunction
źródło
Szukałem, jak sprawdzić, czy funkcja jQuery została zdefiniowana i nie znalazłem jej łatwo.
Być może może tego potrzebować;)
źródło
type0f($.datepicker) !== undefiled
inaczej będzieobject
Jeśli
callback()
wywołujesz nie tylko raz w funkcji, możesz zainicjować argument do ponownego użycia:Na przykład:
Ograniczeniem jest to, że zawsze wykona argument wywołania zwrotnego, chociaż jest niezdefiniowany.
źródło
W przypadku funkcji globalnych możesz użyć tej zamiast
eval
sugerowanej w jednej z odpowiedzi.Możesz także użyć
global.f instanceof Function
, ale afaik. wartośćFunction
będzie różna w różnych ramkach, więc będzie działać poprawnie tylko z aplikacją na pojedynczą ramkę. Dlatego zwykle używamytypeof
zamiast tego. Zauważ, że w niektórych środowiskach mogą również występować anomalietypeof f
, np. Przez MSIE 6-8 niektóre funkcje na przykładalert
miały typ „obiektowy”.Za pomocą funkcji lokalnych możesz użyć tej z zaakceptowanej odpowiedzi. Możesz sprawdzić, czy funkcja jest lokalna czy globalna.
Aby odpowiedzieć na pytanie, przykładowy kod działa dla mnie bez błędów w najnowszych przeglądarkach, więc nie jestem pewien, z czym był problem:
Uwaga: użyłbym
callback !== undefined
zamiastcallback != null
, ale robią prawie to samo.źródło
Większość, jeśli nie wszystkie poprzednie odpowiedzi, wywołują funkcję uboczną
tutaj najlepsza praktyka
masz funkcję
źródło
Jeśli chcesz przedefiniować funkcje, najlepiej użyć zmiennych funkcyjnych, które są zdefiniowane w kolejności ich występowania, ponieważ funkcje są definiowane globalnie, bez względu na to, gdzie występują.
Przykład tworzenia nowej funkcji, która wywołuje poprzednią funkcję o tej samej nazwie:
źródło
To zadziałało dla mnie
źródło
Rozwiązanie jednowierszowe:
źródło