2013-08-12 16 views
13

Perché il seguente file html mostra il titolo come predefinito in IE? Gli altri browser mostrano il titolo come mytitle.IE crea un nuovo ambito per ogni tag di script?

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

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

IE crea un ambito separato per ciascuno dei tag di script?

Ed è solo un bug o perché il comportamento è diverso?

(testato in IE8 e ultima cromo/ff/opera)

+0

Potrebbe essere un bug di sollevamento. Immagino 'var mylib = window.mylib || {}; 'rende il tuo secondo script funzionante come previsto? –

+0

In realtà no, pensavo che sarebbe successo. –

+0

Potrebbe non essere un bug ma piuttosto una differenza nelle specifiche. IE8 è un browser ECMAScript 3 mentre IE9 +, Chrome, ecc. Sono i browser ES5. Non potrei dire cosa ne farebbe ES3, comunque. –

risposta

3

HTML <script> tag JavaScript vengono eseguite nel campo di applicazione della window. Pertanto, i tag script separati vengono eseguiti sullo stesso ambito.

particolare con IE7, cercare di non ri-definire la variabile a seconda volta:

Invece di

var mylib = mylib || {}; 

uso

mylib = window.mylib || {}; 

IE7 probabilmente sovrascrive la definizione di mylib quando var mylib si incontra.

+2

Se sono nello stesso scope in IE allora mylib sarebbe lo stesso di window.mylib no? –

0

Si sta inizializzando window.mylib nel primo tag <script>. Nel secondo tag <script> si sta inizializzando var mylib con mylib non window.mylib. E quindi controllare il valore di title contro questo. Sembra che ci siano alcuni problemi logici se riesco a capirlo correttamente.

Gli <script> s hanno l'ambito alla finestra in modo che non importi quanti ne hai e in cui si accede alle variabili o alle funzioni purché siano correttamente definiti e/o inizializzati.

3

L'ambito non dovrebbe essere un problema. Ogni <script> deve essere valutato all'interno dello stesso ambito globale.

Tuttavia, window.mylib = ... non sembra essere considerato una dichiarazione effettiva in IE8. Quindi, seguirlo con un valore var mylib provoca una sostituzione/ripristino su undefined.

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

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

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

Dovrebbe funzionare come previsto quando si utilizza var mylib o window.mylib in tutto. Sembra che sia proprio questo il problema.

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

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