スイートバレー推進協議会「Web2.0の現状と動向セミナー」 デバイド感
11/07

Javascriptのデバッグって、おそらく多くの方が、FirefoxのFirebugアドオンを使って行っていると思います。このデバッガは強力ですからね。で、デバッグが終わって、Firefoxで動作確認をしたものをIEで実行してみると、動かなかったってケースって多くないですか?
有名なケースでは、これ。

1
2
3
4
5
var  data ={
    item1 : "string1",
    item2 : "string2",
    item3 : "string3",
};

「”string3″」の後の「,」が元凶です。最後の「,」があると、IEでは動きません。この「,」を入れてしまったばっかりに、Firefoxではちゃんと動いていたものがまったく動かなくなってしまって、はまったという人は、ものすごく多いと思います。

ほかにも、いくつかの事例があると思いますが、ちょっとレアなものを発見したのでご紹介します。

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
//< ![CDATA[
var  data ={
    item1 : "string1",
    item2 : "string2",
    item3 : "string3"
};
 
for  ( item in data ) {
    document.write ( data[item] + '<br/>' );
};
//]]>;
</script>

これってIEだと動きません。 もちろん、「”string3″」の後ろに「,」はありません。
for ~ in構文 は、オブジェクトのプロパティ名を列挙します。つまり、data.item1, data.item2, data.item3を順に出力することを意味してます。したがって、”string1″, “string2″, “string3″ という文字列が出力されます。

でも、IEだと動きません。オブジェクトエラーとなります。Firefox、Operaでは問題なく動くのですが。

こうしてみましょうか?

1
2
3
for  ( itm in data ) {
    document.write ( data[itm] + '<br/>' );
};

itemをitmに変えただけです。これは動きました。
# itemをitmに変えようという発想にいたるまで、かなり時間を要しました。

では、これはどうでしょう?

1
2
3
4
var item;
for  ( item in data ) {
    document.write ( data[item] + '<br/>' );
};

itemという変数を局所化してみました。
・・・動きます。

つまり、IEでは、大域変数itemが示すオブジェクトが存在するということにほかなりません。大域変数itemにオブジェクトのプロパティ名をセットしようとすると、オブジェクトエラーになるのですから。

では、このitemというオブジェクトの中身は何なのでしょう?さきほどの、for ~ in構文を使って、itemのプロパティを列挙してみました。

1
2
3
for  ( property in item ) {
    document.write( property + ':' + item[propery] + '<br/>' );
};

当然ですが、このコードはIEのみでしか動きません。
出力した結果をちょっと整形したら、itemはこのようなオブジェクトであることがわかります。

注)DontEnum 属性を持つプロパティはfor ~in構文では列挙できないため(詳しい解説)、これがitemの全貌ではないかもしれません。

このような事例にであうケースはそうそうないと思いますが、itemという変数を使用する際は注意した方がよいですね。

この記事へのトラックバックURL:

コメントを書く

このエントリーを含むはてなブックマーク