ただし、詳細についてはあまり知られていない部分もあります。これらの詳細を分析した後、John Resig は完璧な解決策を提供してくれました。これについては、この記事で詳しく紹介します。
1. 従来の手法の不明な詳細
関数の型を判断する際に、例:
function fn(){
//content
}
alert(typeof fn)//結果は「function」です。
ただし、この方法は一部のブラウザでは想像どおりに機能しません。
1、Firefox2 および Firefox3
これら 2 つのブラウザでは、typeof を使用して HTML オブジェクト要素の型を検出すると、結果は「オブジェクト」ではなく不正確な「関数」になります。 HTMLドキュメントなど。例:
alert(typeof HTMLDocument);
/ /Firefox2 の場合、結果は「関数」です。
//Firefox3 の場合、結果は「オブジェクト」です。
2、Firefox2 の場合正規表現。このブラウザで返される結果は「関数」です (Firefox3 では結果は「オブジェクト」です)。例:
var reg = /test/;
alert(typeof reg);
//結果は Firefox2 では "function" です。 >//Firefox3 の場合 結果は "object";
注: Safari でテストしましたが、結果も "function" です。
3、IE6 および IE7
IE で DOM 要素に対して typeof メソッドを使用すると、結果は「オブジェクト」になります。例:
alert(typeof document.getElementsByTagName ("body" )[0].getAttribute);
//結果は "object"
4. Safari 3
Safari は、NodeList を信じます。 DOM 要素の部分は関数です。例:
コードをコピーします。 コードは次のとおりです。 >alert(typeof document.body.childNodes); //結果は "function" です
明らかに、オブジェクトが関数であるかどうかをテストしたい場合は、typeof メソッドを使用します。本当の意味での試験結果を保証するものではありません。次に、すべてのブラウザでテスト結果を保証するソリューションが必要になります。関数自体には apply() と call() という 2 つのメソッドがあることがわかっていますが、これら 2 つのメソッドは IE の問題のある関数には存在しません。次のテストを試してください:
コードをコピー
コードは次のとおりです:alert(typeof document.getElementsByTagName("body")[0].getAttribute.call) / /IE では結果は「未定義」になります
明らかに、これら 2 つのメソッドは使用できません。
2. 完璧なソリューションと実装プロセス
John Resig は、オブジェクトが関数であるかどうかを判断するための完璧なソリューションを提供してくれました。 🎜>
コードをコピー
コードは次のとおりです。 function isFunction( fn ) { return !fn && !fn.nodeName && fn.constructor != 文字列 && fn.constructor != RegExp && fn.constructor != 配列 &&
/function/i.test( fn "" ); > }
この関数は、まずテスト オブジェクトが存在することを確認し、それを「関数」を含む文字列にシリアル化します。これが検出の基礎です (fn.constructor != String、fn.constructor != Array、および fn.constructor ! =正規表現)。さらに、宣言された関数が DOM ノード (fn.nodeName) ではないことを確認する必要があります。次に、toString テストを実行できます。関数を文字列に変換すると、ブラウザ上で (fn "") を実行すると、「関数名(){...}」のような結果が得られます。これが関数であるかどうかを判断するのは、文字列に「関数」という単語が含まれているかどうかを確認するのと同じくらい簡単です。これは驚くべきことに機能し、問題のどの関数についても、すべてのブラウザで必要な結果が得られます。従来の方法と比較すると、この関数の実行速度はやや遅いため、控えめに使用することをお勧めします。
John Resig は jQuery ライブラリの開発者であり、このライブラリを使用している友人はその簡潔な構文と優れたパフォーマンスをよく知っていると思います。コードの単純さと効率的なパフォーマンスの追求に加えて、作者の完璧さの精神も印象的です。あなたが完璧主義者であれば、この記事は役に立つと思います。