回答:
typeof callback === "function"
現在のすべての回答はリテラル文字列を使用していますが、可能であればコードに含めないようにします-これはそうではありません(ブートするための意味的な意味を提供します)。
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
個人的には、コードにぶら下がっている文字列の数を減らすようにしています...
また、私はそれtypeof
が関数ではなく演算子であることを認識していますが、それを後者として表示する構文を使用してもほとんど害はありません。
isFunction(not_defined))
どこでnot_defined
あるか試しましnot_defined is not defined
たが、正しいFireBugが返されましたが、関数はfalseを返してエラーを生成しないはずです...
not_defined
その値を渡すためにシンボルを解決しようとしていて、そのisFunction()
解決に失敗しているため、エラーが発生しても、私の回答に示されている関数はエラーを返しません。isFunction()
この問題を解決するための定義に対して何もできません。
isFunction
を避けて、単に行い(typeof no_function == typeof Function)
ます。
typeof(Function())
は、Functionが関数なので、実際に使用する必要 があります。ただし、配列、オブジェクト、およびその他の組み込みプロトタイプ(より適切な用語がないため)も同様です。たとえば、配列をチェックする場合は使用typeof(array) === typeof(Array)
しません。typeof(array) === typeof(Array())
注意と一貫性がある場合は、実際に関数を評価する必要があるので、これを使用します。
if (callback && typeof(callback) == "function")
なお、コールバックに(単独で)を評価しfalse
、それがある場合にundefined
、null
、0
、またはfalse
。と比較することnull
は非常に具体的です。
callback
それ自体が「false-y」の値に評価される場合、そのtypeofが「関数」になることはありません。
関数が実装されているかどうかを判断するこれらのメソッドは、変数が定義されていない場合も失敗するため、文字列の受信をサポートするより強力なものを使用しています。
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
代わりに単に参照してくださいdoesthisexist
。ただし、示されているようにeval(これは悪です)を使用すると、名前付き関数でのみ機能します。これは、問題のユースケースでは機能しません。
JavaScriptの新機能動作が変更されたかどうかはわかりませんが、possibleFunctionが定義されていないと、Jason Bunting(6年前)によって提供されたソリューションが機能しません。
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
これはReferenceError: possibleFunction is not defined
、エンジンが可能なシンボルを解決しようとするときにエラーをスローします(Jasonの回答へのコメントで言及されているように)
この動作を回避するには、存在するかどうかを確認する関数の名前のみを渡すことができます。そう
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
これにより、変数をチェックする関数に設定するか、定義されていない場合は空のオブジェクトに設定して、上記の問題を回避します。
試してください:
if (typeof(callback) == 'function')
if ('function' === typeof callback) ...
if(typeof Function === typeof callback)...
ですか?:)
typeof
、それは-理由はJavaScriptの新しい/異なる実装を、後で別のリターンの何か(代わりに「機能」のかもしれない「機能」)を感じて、それは可能性が低いことになりますように新しい/異なる実装はtypeof Function === typeof callback
、セマンティックレベルで同じでなければならないため、チェックを破ります。
typeof(callback) == "function"
私はするかもしれません
try{
callback();
}catch(e){};
受け入れられる答えがあることは知っていますが、誰もこれを提案しませんでした。これが慣用句の説明に当てはまるかどうかは本当にわかりませんが、すべてのケースで機能します。
新しいJavaScriptエンジンでは、finally
代わりにを使用できます。
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
、回答の1つで提案されている代わりにこれを使用できます。
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
「オブジェクト」タイプが含まれていました。
ローカル関数により、受け入れられた答えの1つを使用できます。関数がローカルかグローバルかをテストすることもできます。
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 something_cool(text, callback){
callback && callback();
}