How to tell if a JavaScript function is defined

JavascriptReflection

Javascript Problem Overview


How do you tell if a function in JavaScript is defined?

I want to do something like this

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

But it gets me a

> callback is not a function

error when callback is not defined.

Javascript Solutions


Solution 1 - Javascript

typeof callback === "function"

Solution 2 - Javascript

All of the current answers use a literal string, which I prefer to not have in my code if possible - this does not (and provides valuable semantic meaning, to boot):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

Personally, I try to reduce the number of strings hanging around in my code...


Also, while I am aware that typeof is an operator and not a function, there is little harm in using syntax that makes it appear as the latter.

Solution 3 - Javascript

if (callback && typeof(callback) == "function")

Note that callback (by itself) evaluates to false if it is undefined, null, 0, or false. Comparing to null is overly specific.

Solution 4 - Javascript

Those methods to tell if a function is implemented also fail if variable is not defined so we are using something more powerful that supports receiving an string:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}

Solution 5 - Javascript

Try:

if (typeof(callback) == 'function')

Solution 6 - Javascript

I might do

try{
    callback();
}catch(e){};

I know there's an accepted answer, but no one suggested this. I'm not really sure if this fits the description of idiomatic, but it works for all cases.

In newer JavaScript engines a finally can be used instead.

Solution 7 - Javascript

New to JavaScript I am not sure if the behaviour has changed but the solution given by Jason Bunting (6 years ago) won't work if possibleFunction is not defined.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

This will throw a ReferenceError: possibleFunction is not defined error as the engine tries to resolve the symbol possibleFunction (as mentioned in the comments to Jason's answer)

To avoid this behaviour you can only pass the name of the function you want to check if it exists. So

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

This sets a variable to be either the function you want to check or the empty object if it is not defined and so avoids the issues mentioned above.

Solution 8 - Javascript

typeof(callback) == "function"

Solution 9 - Javascript

function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

Solution 10 - Javascript

if ('function' === typeof callback) ...

Solution 11 - Javascript

Try:

if (!(typeof(callback)=='undefined')) {...}

Solution 12 - Javascript

Try this:

callback instanceof Function

Solution 13 - Javascript

If you look at the source of the library @Venkat Sudheer Reddy Aedama mentioned, underscorejs, you can see this:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

This is just my HINT, HINT answer :>

Solution 14 - Javascript

If you use http://underscorejs.org, you have: http://underscorejs.org/#isFunction

_.isFunction(callback);

Solution 15 - Javascript

I was looking for how to check if a jQuery function was defined and I didn't find it easily.

Perhaps might need it ;)

if(typeof jQuery.fn.datepicker !== "undefined")

Solution 16 - Javascript

If the callback() you are calling not just for one time in a function, you could initialize the argument for reuse:

callback = (typeof callback === "function") ? callback : function(){};

For example:

function something_cool(text, callback) {
    // Initialize arguments
	callback = (typeof callback === "function") ? callback : function(){};

    alert(text);
    
    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

The limitation is that it will always execute the callback argument although it's undefined.

Solution 17 - Javascript

Using optional chaining with function calls you could do the following:

function something_cool(text, callback) {
    alert(text);
    callback?.();
}

If callback is a function, it will be executed.

If callback is null or undefined, no error is thrown and nothing happens.

However, if callback is something else e.g. a string or number, a TypeError will still be thrown.

Solution 18 - Javascript

For global functions you can use this one instead of eval suggested in one of the answers.

var global = (function (){
	return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

You can use global.f instanceof Function as well, but afaik. the value of the Function will be different in different frames, so it will work only with a single frame application properly. That's why we usually use typeof instead. Note that in some environments there can be anomalies with typeof f too, e.g. by MSIE 6-8 some of the functions for example alert had "object" type.

By local functions you can use the one in the accepted answer. You can test whether the function is local or global too.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

To answer the question, the example code is working for me without error in latest browers, so I am not sure what was the problem with it:

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Note: I would use callback !== undefined instead of callback != null, but they do almost the same.

Solution 19 - Javascript

Most if not all previous answers have side effects to invoke the function

here best practice

you have function

function myFunction() {
        var x=1;
    }

direct way to test for it

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');

using a string so you can have only one place to define function name

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');

Solution 20 - Javascript

If you wish to redefine functions, it is best to use function variables, which are defined in their order of occurrence, since functions are defined globally, no matter where they occur.

Example of creating a new function that calls a previous function of the same name:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

Solution 21 - Javascript

This worked for me

if( cb && typeof( eval( cb ) ) === "function" ){
	eval( cb + "()" );
}

Solution 22 - Javascript

I would rather suggest following function:

function isFunction(name) {
    return eval(`typeof ${name} === typeof Function`);
}

Solution 23 - Javascript

One-line solution:

function something_cool(text, callback){
    callback && callback();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAaron LeeView Question on Stackoverflow
Solution 1 - JavascriptTom RitterView Answer on Stackoverflow
Solution 2 - JavascriptJason BuntingView Answer on Stackoverflow
Solution 3 - JavascriptRobin like the birdView Answer on Stackoverflow
Solution 4 - JavascriptpatricioroccaView Answer on Stackoverflow
Solution 5 - JavascriptbdukesView Answer on Stackoverflow
Solution 6 - JavascriptQuentin EnglesView Answer on Stackoverflow
Solution 7 - JavascriptRussell OrmesView Answer on Stackoverflow
Solution 8 - JavascriptView Answer on Stackoverflow
Solution 9 - JavascriptConroyPView Answer on Stackoverflow
Solution 10 - JavascriptAndrew HedgesView Answer on Stackoverflow
Solution 11 - JavascriptBrianView Answer on Stackoverflow
Solution 12 - JavascripteWolfView Answer on Stackoverflow
Solution 13 - JavascriptVentyCZView Answer on Stackoverflow
Solution 14 - JavascriptSudheer AedamaView Answer on Stackoverflow
Solution 15 - JavascriptmiguelmpnView Answer on Stackoverflow
Solution 16 - JavascriptNick TsaiView Answer on Stackoverflow
Solution 17 - JavascriptDarren GView Answer on Stackoverflow
Solution 18 - Javascriptinf3rnoView Answer on Stackoverflow
Solution 19 - JavascriptTexWillerView Answer on Stackoverflow
Solution 20 - JavascriptDavid SpectorView Answer on Stackoverflow
Solution 21 - JavascriptPatrick OgbuitepuView Answer on Stackoverflow
Solution 22 - JavascriptMichel CasabiancaView Answer on Stackoverflow
Solution 23 - JavascriptSamir AlajmovicView Answer on Stackoverflow