2013-08-12 12 views
13

次のHTMLファイルがIEでタイトルとしてタイトルを表示するのはなぜですか?他のブラウザはタイトルをmytitleとして表示します。IEはスクリプトタグごとに新しいスコープを作成しますか?

<script> 
window.mylib = window.mylib || {}; 
mylib.title = 'mytitle'; 
</script> 

<script> 
var mylib = mylib || {}; 
document.title = mylib.title || 'default'; 
</script> 

IEはスクリプトタグごとに個別のスコープを作成しますか?

これは単なるバグか、動作が異なるのはなぜですか?

(IE8でテストされ、最新のクロム/ FF /オペラ)

+0

吊りバグかもしれません。私は 'var mylib = window.mylib ||を想像しています。 {}; 'あなたの2番目のスクリプトを期待どおりに動作させますか? –

+0

実際、そうではないと思いました。 –

+0

バグではなく、仕様の違いかもしれません。 IE8はECMAScript 3のブラウザで、IE9 +、ChromeなどはES5のブラウザです。しかし、ES3がそれを引き起こす原因は何かを言い表すことはできませんでした。 –

答えて

3

HTMLタグ<script>のJavascriptはwindowの範囲内で実行されています。したがって、分離されたスクリプトタグは同じスコープで実行されます。

具体的にIE7で、二度目に変数を再定義しないようにしよう:

代わり

var mylib = mylib || {}; 

使用

mylib = window.mylib || {}; 

のIE7は、おそらくmylibときの定義を上書きしvar mylib遭遇する。

+2

IEの同じ範囲にある場合、mylibはwindow.mylibと同じではありませんか? –

0

最初の<script>タグでwindow.mylibを初期化しています。 2番目の<script>タグでは、var mylibmylibではなくwindow.mylibで初期化しています。そしてそれに対してtitleの値をチェックします。私が正しく理解できるなら、いくつかの論理的な問題があるようです。

<script>はウィンドウにスコープが設定されているため、適切に定義および/または初期化されていれば、変数や関数にアクセスしている人の数や変数には関係ありません。

3

スコープは問題ではありません。各<script>は、同じグローバルスコープ内で評価する必要があります。

しかし、window.mylib = ...は、IE8では実際の宣言とは見なされていません。したがって、それに続いてvar mylibを指定すると、オーバーライド/リセットがundefinedになります。

<script> 
    window.mylib = {}; 
</script> 

<script> 
    console.log(typeof window.mylib); // object 
</script> 

<script> 
    var mylib; 
    console.log(typeof window.mylib); // undefined 
</script> 

var mylibまたはwindow.mylib全体のいずれかを使用すると、期待どおりには動作するはずです。それはちょうど問題である混合物だと思う。

<script> 
    var mylib = mylib || {}; 
    mylib.title = 'mytitle'; 
</script> 

<script> 
    var mylib = mylib || {}; 
    document.title = mylib.title || 'default'; // 'mytitle' 
</script> 
関連する問題