Answers:
typeof callback === "function"
当前所有的答案都使用文字字符串,如果可能的话,我宁愿不要在我的代码中使用该字符串-这样做(并提供有价值的语义含义,以便启动):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
就个人而言,我尝试减少代码中徘徊的字符串数量。
另外,虽然我知道这typeof
是一个运算符而不是一个函数,但是使用使它看起来像后者的语法几乎没有什么害处。
isFunction(not_defined))
在哪里not_defined
是未定义的函数的名称,并且FireBug返回的not_defined is not defined
是正确的,但是您的函数应该返回false并且不会生成错误...
not_defined
以便将其值传递给该符号isFunction()
,但无法解析它。无法定义isFunction()
解决该问题。
isFunction
而只是做一个(typeof no_function == typeof Function)
。
typeof(Function())
因为Function是一个函数;但是Array,Object和其他内置原型也是如此(由于缺乏更好的术语)。如果您要检查数组,则不会使用该数组typeof(array) === typeof(Array)
;例如,typeof(array) === typeof(Array())
之所以使用它,是因为如果您保持谨慎和一致,则实际上需要评估该函数。
如果未定义变量,则那些用于判断是否实现函数的方法也会失败,因此我们使用了更强大的功能来支持接收字符串:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
而不是即可doesthisexist
。但是,使用所示的eval(这是邪恶的)仅适用于命名函数-不适用于问题中的用例。
JavaScript的新手,我不确定行为是否已更改,但是如果未定义均可能的功能,Jason Bunting(6年前)给出的解决方案将无法正常工作。
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
ReferenceError: possibleFunction is not defined
当引擎尝试解析符号possibleFunction时,这将引发错误(如Jason答案的注释中所述)
为避免这种情况,您只能传递要检查的函数名称是否存在。所以
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
这会将变量设置为您要检查的函数,或者将其设置为空对象(如果未定义),从而避免了上述问题。
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
样 :)
typeof
由于JavaScript的新的/不同的实现,调用此函数以后会返回不同的内容(也许是“ Function”而不是“ function”),这似乎不太可能一个新的/不同的实现会破坏typeof Function === typeof callback
检查,因为它在语义级别上应该是相同的。
我可能会做
try{
callback();
}catch(e){};
我知道有一个可以接受的答案,但是没有人建议这样做。我不太确定这是否符合惯用语言的描述,但它适用于所有情况。
在较新的JavaScript引擎中,finally
可以改为使用a 。
typeof callback
无论如何我通常都会用。
accepted_types.indexOf(typeof value) !== -1
它是否在类型范围内。在这种情况下,我认为例外是禁止的。
尝试这个:
callback instanceof Function
如果使用http://underscorejs.org,那么您将拥有:http : //underscorejs.org/#isFunction
_.isFunction(callback);
我一直在寻找如何检查是否定义了jQuery函数,但我发现它并不容易。
也许可能需要它;)
if(typeof jQuery.fn.datepicker !== "undefined")
type0f($.datepicker) !== undefiled
其他情况相同object
如果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');
这对我有用
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
一线解决方案:
function something_cool(text, callback){
callback && callback();
}