reflektion - Hur man ser om en JavaScript-funktion är definierad
Hur ser man om en funktion i JavaScript är definierad?
Jag vill göra något liknande detta
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
Men det ger mig en
återuppringning är inte en funktion
fel när återuppringning inte är definierad.
Svar #1
typeof callback === "function"
Svar #2
Alla de nuvarande svaren använder en bokstavlig sträng, vilket jag föredrar att inte ha i min kod om möjligt - detta gör det inte (och ger dessutom värdefull semantisk mening):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
Personligen försöker jag minska antalet strängar som hänger runt i min kod...
Dessutom, även om jag är medveten om att typeof är en operator och inte en funktion, är det ingen större skada i att använda syntax som får det att se ut som det senare.
Svar #3
if (callback && typeof(callback) == "function")
Observera att callback (i sig självt) utvärderas till false om det är undefined, null, 0 eller false. Jämförelse med null är alltför specifik.
Svar #4
Genom att använda valfri kedjning med funktionsanrop kan du göra följande:
function something_cool(text, callback) {
alert(text);
callback?.();
}
Om callback är en funktion kommer den att köras.
Om callback är null eller undefined, kastas inget fel och ingenting händer.
Men om callback är något annat, t.ex. en sträng eller ett nummer, kommer fortfarande ett TypeError att kastas.
Svar #5
Dessa metoder för att avgöra om en funktion är implementerad fungerar också inte om variabeln inte är definierad, så vi använder något mer kraftfullt som stöder att ta emot en sträng:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
