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.
This question is related to
javascript
reflection
typeof callback === "function"
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.
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.
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.
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.
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.
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.
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.
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.
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);
}
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);
}
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.
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.
Try:
if (typeof(callback) == 'function')
Try:
if (typeof(callback) == 'function')
Try:
if (typeof(callback) == 'function')
Try:
if (typeof(callback) == 'function')
typeof(callback) == "function"
typeof(callback) == "function"
typeof(callback) == "function"
typeof(callback) == "function"
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.
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.
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
if ('function' === typeof callback) ...
if ('function' === typeof callback) ...
if ('function' === typeof callback) ...
if ('function' === typeof callback) ...
Try:
if (!(typeof(callback)=='undefined')) {...}
Try:
if (!(typeof(callback)=='undefined')) {...}
Try:
if (!(typeof(callback)=='undefined')) {...}
Try:
if (!(typeof(callback)=='undefined')) {...}
Try this:
callback instanceof Function
Try this:
callback instanceof Function
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 :>
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 :>
If you use http://underscorejs.org, you have: http://underscorejs.org/#isFunction
_.isFunction(callback);
If you use http://underscorejs.org, you have: http://underscorejs.org/#isFunction
_.isFunction(callback);
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")
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")
Most if not all previous answers have side effects to invoke the function
here best practice
you have function
function myFunction() {_x000D_
var x=1;_x000D_
}
_x000D_
//direct way_x000D_
if( (typeof window.myFunction)=='function')_x000D_
alert('myFunction is function')_x000D_
else_x000D_
alert('myFunction is not defined');
_x000D_
//byString_x000D_
var strFunctionName='myFunction'_x000D_
if( (typeof window[strFunctionName])=='function')_x000D_
alert(s+' is function');_x000D_
else_x000D_
alert(s+' is not defined');
_x000D_
Most if not all previous answers have side effects to invoke the function
here best practice
you have function
function myFunction() {_x000D_
var x=1;_x000D_
}
_x000D_
//direct way_x000D_
if( (typeof window.myFunction)=='function')_x000D_
alert('myFunction is function')_x000D_
else_x000D_
alert('myFunction is not defined');
_x000D_
//byString_x000D_
var strFunctionName='myFunction'_x000D_
if( (typeof window[strFunctionName])=='function')_x000D_
alert(s+' is function');_x000D_
else_x000D_
alert(s+' is not defined');
_x000D_
This worked for me
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
This worked for me
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
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.
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.
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.
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.
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
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
One-line solution:
function something_cool(text, callback){
callback && callback();
}
One-line solution:
function something_cool(text, callback){
callback && callback();
}
Source: Stackoverflow.com