7cc@はてなブログ

JavaScriptとかとか

IEで「オブジェクトを指定してください」のエラー

エラーメッセージを言い換えると分かった。

「オブジェクトを指定してください」
「オブジェクトが指定されていないよ」
「オブジェクトが無いよ」
「オブジェクトがundefinedだよ」

原因

3通りあるようだ

原因1 古いIE文字コード

IEの謎エラー対策(1) 「オブジェクトを指定して下さい」が外部ソースの場合 - 趣味の延長線 の通り、charsetを指定する。

原因2 関数が未定義

  • (最新版含む)そのバージョンのIEでは使えない関数を使用している
  • ファイルを読み込む順序が間違っている
  • グローバル変数が上書きされている($とか)
  • typo(スペルミス)

var hoge
hoge(1)  // "オブジェクトを指定してください。"

原因3 関数の後にセミコロン忘れ

(function(){})()
(function(){})()

戻り値の無い関数はundefinedを返す。
分かりやすいようにfunctionalertに置き換えて整理すると、

(alert)() // =undefined
(alert)()

そしてこうなる。

undefined(alert)()

この時、

undefined()

という式を実行しようとする。原因2と同じように、関数ではないものを実行しようとしているのでエラー。

余談、エラーメッセージについて

obj.propの形の関数だと少し分かりにくい。

Math.foo(1) 

"オブジェクトは 'foo' プロパティまたはメソッドをサポートしていません。"

[Math.foo].map(function(e){
  return e(1)
}) 

"オブジェクトを指定してください。"

同じことなら、同じエラーメッセージにして欲しい。