5

変数objがあります

obj は何でもかまいません。obj が関数かどうかを検出したいと思います。通常、私はするだろう

typeof obj === 'function'

obj がネイティブ関数の場合、問題は IE <= 8 にあります (少なくとも、window.open と window.alert で発生することを知っておいてください)。object が wi​​ndow.open === 'object' の場合の IE の typeof obj

window.open が実際に関数かどうかを確認する信頼できる方法はありますか?

これでjQueryも失敗することがわかります

$.isFunction(window.open) => false //in IE

これは明らかにjquery 1.3か何かで削除されましたが、それ以前にどのようにテストしたかはわかりません。

追加: 1つの方法は電話することのようです

Function.prototype.apply.apply(window.open)

これでエラーが発生しない場合、window open は関数です。もしあなたがそうするなら

Function.prototype.apply.apply({})

次に、IE は「関数が必要です」というエラーをスローします。しかし、ウィンドウを開いて変数が関数かどうかを確認するのは良い解決策とは言えません..

4

1 に答える 1

0

ネイティブ ブラウザ機能に関しては、機能検出で十分です。

if (window.open) {
    window.open(...)
}

誰かがネイティブ関数を上書きした場合、そのコードを使用しないでください。彼らはこれを行うべきではありません、そしてあなたは問題を求めています。

また、文脈がなければこの質問に答えることも困難です。関数として渡してobj呼び出しています。複数のデータ型を渡し、その型に基づいて何か異なることをしている場合、ここで関数を処理するべきではないと主張します。ブラウザーの癖のため、別の関数を動的に呼び出す関数を明示的に作成し、エラー チェックを行わないでください。

于 2014-10-29T15:50:25.097 に答える