web-dev-qa-db-ja.com

JavaScriptで未定義の関数をテストする

そのため、Safariは1つの特定のエラーについて私に叫び続けます。

Google Maps APIを使用してmap.getCenter();を呼び出そうとしています。ただし、これはmapが完全にロードされる前に発生する場合があります。

そのため、代わりに関数で次のようにundefined呼び出しをテストします。

if (map.getCenter() != undefined)

しかし、結果がundefinedかどうかをテストするためだけに呼び出しを行うのも好きではないので、それでもエラーが発生します。

ここで助けてもらえますか?

ありがとう!

18
slandau
if (typeof map !== 'undefined' && map.getCenter) {
   // code for both map and map.getCenter exists
} else {
  // if they dont exist
}

これは、関数の存在を確認する正しい方法です。関数を呼び出してその存在をテストすると、エラーが発生します。

PDATE:スニペットが更新されました。

30
Aravindan R

私は実際にこれらの線に沿って何かを好みます。

if(typeof myfunc == 'function') { 
    myfunc(); 
}

何かが未定義ではないからといって、それが機能するわけではありません。

42
Swift
_if (typeof map.getCenter !== 'undefined')
_

エラーをスローしません。

ですから、if (typeof map.getCenter === 'function') map.getCenter();

5
Ronny

技術的には、mapmap.getCenter()ではなく未定義であるかどうかをテストする必要があります。未定義の参照で関数を呼び出すことはできません。

ただし、 Google独自のチュートリアル は、body.onloadハンドラーでAPIにアクセスするJavaScriptを呼び出して、すべてのリモート.jsファイルが読み込まれるまで何も参照しないようにすることをお勧めします。これやってるの?これは、APIをロードする前にJavaScriptが実行されるときに完全に失敗するのではなく、問題を永続的に解決します。

4
matt b

私は最近、typeof演算子を使用して物や型をテストする習慣があります。これは、応答タイプの混乱を避けるために文字列としてタイプを返します。

if( typeof map.getCenter != 'undefined') ...

より正確かどうかはわかりませんが、このプロセスで良い結果が得られます。

1
MacAnthony

mapが未定義かどうかをテストする必要があります。現在のチェックでは、まだ関数呼び出しを実行しようとしています。

0
Ash Burlaczenko

Map.getCenter()が常に関数であると仮定すると、このチェックを使用するだけで十分です。

if (map.getCenter) {
      var x = map.getCenter();
}
0