如何判断一个JavaScript函数是否被定义

如何判断JavaScript中的函数是否已定义?

我想做这样的事情

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

但是它得到了一个

回调不是函数

未定义回调时发生错误。

207926 次浏览
typeof callback === "function"

试一试:

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

试一试:

if (!(typeof(callback)=='undefined')) {...}
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
if (callback && typeof(callback) == "function")

请注意,如果callback为undefinednull0false,则它(通过自身)的计算结果为false。比较null过于具体。

所有当前的答案都使用一个字面字符串,如果可能的话,我更喜欢在我的代码中没有-这不是(并且提供了有价值的语义含义,引导):

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

就我个人而言,我试图减少代码中存在的字符串数量……


此外,虽然我知道typeof是一个操作符而不是一个函数,但使用语法使它看起来像后者并没有什么害处。

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

如果变量没有定义,那些判断函数是否实现的方法也会失败,所以我们使用了更强大的支持接收字符串的方法:

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


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

试试这个:

callback instanceof Function

对于JavaScript新手,我不确定行为是否发生了变化,但如果没有定义可能函数,Jason Bunting(6年前)给出的解决方案将不起作用。

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

这将在引擎试图解析符号possibleFunction时抛出ReferenceError: possibleFunction is not defined错误(如Jason回答的评论中所述)

为了避免这种行为,您只能传递要检查是否存在的函数的名称。所以

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

这将变量设置为您想要检查的函数,如果它没有定义,则设置为空对象,从而避免了上面提到的问题。

我可能会

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

我知道有一个公认的答案,但没人这么建议。我不确定这是否符合惯用语的描述,但它适用于所有情况。

在较新的JavaScript引擎中,可以使用finally代替。

如果你使用http://underscorejs.org,你有: http://underscorejs.org/#isFunction < / p >
_.isFunction(callback);

我正在寻找如何检查一个jQuery函数是否被定义,我没有找到它很容易。

也许你会需要它;)

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

一行的解决方案:

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

如果你看一下前面提到的@Venkat Sudheer Reddy Aedama库的,下划线,你可以看到:

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

这只是我的提示,提示答案:>

如果你在函数中不只调用一次callback(),你可以初始化参数以便重用:

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

例如:

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


alert(text);


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

限制是它将始终执行回调参数,尽管它是未定义的。

对于全局函数,你可以使用这个函数,而不是其中一个答案中建议的eval

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


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

你也可以使用global.f instanceof Function,但是afaik。Function的值在不同的帧中是不同的,所以它只能正确地用于单个帧应用程序。这就是为什么我们通常使用typeof代替。注意,在某些环境中,typeof f也可能出现异常,例如在MSIE 6-8中,一些函数(例如alert)具有“对象”类型。

通过局部函数,您可以使用接受的答案中的一个。你也可以测试这个函数是局部的还是全局的。

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

为了回答这个问题,示例代码在最新的浏览器中为我工作,没有错误,所以我不确定它有什么问题:

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

注意:我将使用callback !== undefined而不是callback != null,但它们的作用几乎相同。

大多数(如果不是所有)前面的答案都有调用该函数的副作用

以下是最佳实践

你有函数

function myFunction() {
var x=1;
}
直接的方法来测试它

//direct way
if( (typeof window.myFunction)=='function')
alert('myFunction is function')
else
alert('myFunction is not defined');
使用字符串,这样可以只有一个位置定义函数名

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

如果希望重新定义函数,最好使用函数变量,因为函数是全局定义的,无论它们出现在哪里。

创建一个新函数,调用之前同名的函数:

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

这对我很有效

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

我建议以下功能:

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

使用可选的函数调用链接你可以做以下事情:

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

如果callback是一个函数,它将被执行。

如果callbacknullundefined,则不会抛出错误,也不会发生任何事情。

然而,如果callback是其他东西,例如字符串或数字,TypeError仍然会被抛出。