2013-08-12 29 views
13

Tại sao tệp html sau hiển thị tiêu đề làm mặc định trong IE? Các trình duyệt khác hiển thị tiêu đề là mytitle.IE có tạo phạm vi mới cho mỗi thẻ tập lệnh không?

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

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

IE có tạo phạm vi riêng cho từng thẻ tập lệnh không?

Và đó chỉ là lỗi hoặc tại sao hành vi lại khác?

(thử nghiệm trong IE8 và mới nhất chrome/ff/opera)

+0

Có thể là lỗi tạm thời. Tôi tưởng tượng 'var mylib = window.mylib || {}; 'làm cho tập lệnh thứ hai của bạn hoạt động như mong đợi? –

+0

Thực tế là không, tôi nghĩ rằng nó sẽ mặc dù. –

+0

Có thể không phải là một lỗi mà là một sự khác biệt trong spec. IE8 là một trình duyệt ECMAScript 3 trong khi IE9 +, Chrome, vv là các trình duyệt ES5. Không thể nói những gì của ES3 sẽ gây ra điều đó, mặc dù. –

Trả lời

3

HTML <script> thẻ Javascript được thực hiện trong phạm vi của window. Do đó, các thẻ script được tách riêng được thực hiện trên cùng một phạm vi.

Cụ thể với IE7, cố gắng không tái định biến trên lần thứ hai:

Thay vì

var mylib = mylib || {}; 

sử dụng

mylib = window.mylib || {}; 

IE7 lẽ ghi đè định nghĩa của mylib khi var mylib gặp phải.

+2

Nếu chúng nằm trên cùng một phạm vi trong IE thì mylib sẽ giống như window.mylib no? –

0

Bạn đang khởi tạo window.mylib trong thẻ <script> đầu tiên. Trong thẻ thứ hai <script> bạn đang khởi tạo var mylib với mylib không window.mylib. Và sau đó kiểm tra giá trị của title để chống lại điều này. Có vẻ như một số vấn đề logic nếu tôi có thể hiểu nó một cách chính xác.

Các <script> s được đưa vào cửa sổ, cho dù bạn đang truy cập vào các biến hoặc chức năng nào miễn là chúng được xác định đúng và/hoặc được khởi tạo.

3

Phạm vi không phải là vấn đề. Mỗi <script> phải được đánh giá trong cùng phạm vi toàn cầu.

Tuy nhiên, window.mylib = ... dường như không được coi là tuyên bố thực tế trong IE8. Vì vậy, theo dõi nó với một var mylib gây ra ghi đè/đặt lại thành undefined.

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

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

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

Nó sẽ hoạt động như mong đợi khi sử dụng var mylib hoặc window.mylib trong suốt. Có vẻ như đó chỉ là hỗn hợp đó là vấn đề.

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

<script> 
    var mylib = mylib || {}; 
    document.title = mylib.title || 'default'; // 'mytitle' 
</script> 
Các vấn đề liên quan