2011-07-05 16 views
6

OK, đây là lái xe cho tôi điên:Bạn đã bao giờ thấy hành vi/lỗi IE JavaScript lạ này chưa?

ví dụ đầu tiên, không có vấn đề:

<script> 

window.myvar = 150; 

if (false) { 
    var myvar = 3; 
} 

// This will popup "150" 
alert(myvar) 

</script> 

Bây giờ, với hai yếu tố kịch bản:

<script> 

window.myvar = 150; 

</script> 

<script> 

if (false) { 
    var myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 

Thử nghiệm với IE8.

Bạn có biết tại sao không?

+0

bạn có thể vui lòng kiểm tra xem mã tại http://tinypaste.com/49c80 hiển thị lỗi tương tự như trên, vì vậy tôi có thể trả lời câu hỏi của bạn? Tôi không thể kiểm tra vì hiện tại tôi không sử dụng hộp Windows của mình. Ad @ m – kirb

+0

Tôi ước tôi có IE8 để kiểm tra ngay bây giờ. Âm thanh như định nghĩa của 'myvar' đang được treo lên và che khuất thuộc tính của' cửa sổ'. – alex

+0

@adam kiểm tra mã OK trong IE7/8, nó cảnh báo 100 – clairesuzy

Trả lời

4

Trong ví dụ thứ hai, trong khối script thứ hai của bạn, myvar đã là hoisted (theo thông số kỹ thuật) ở đầu phạm vi chứa. Hãy nhớ rằng JavaScript không có phạm vi khối, chỉ phạm vi chức năng.

Do đó, var myvar (định nghĩa kéo lên được giải thích) sẽ dẫn đến myvarundefined khi alert() nhìn lên myvar trên VariableObject.

+0

vẫn chưa rõ ràng, những gì được nâng lên? –

+0

@sushil Tôi đã thêm một liên kết giúp giải thích chi tiết về việc nâng cấp chi tiết. – alex

+0

cảm ơn bạn, giờ đã rõ.Bạn không biết tại sao nó hoạt động khác trên trình duyệt khác mặc dù – Claudio

0

Điều này không xảy ra với tôi trong iOS Safari trên 4.3.1, do đó, nó có thể là một lỗi trong IE. Tuy nhiên, câu trả lời của @ alex cũng có thể đúng. Quảng cáo @ m

0

Tôi cho cẩu, như alex nói. Trình biên dịch thấy rằng bạn xác định myvar trong khối của bạn (var myvar bên trong if) và đặt trước đây là myvar. Tôi không chắc chắn, cho dù đó là lỗi hoặc tính năng, mặc dù.

3

Đó là bởi vì kể từ khi javascript không phạm vi dựa trên mức chức năng, mã của bạn tính/biên dịch/tương đương như sau:

<script> 

window.myvar = 150; 

</script> 

<script> 
var myvar; 

if (false) { 
    myvar = 3; 
} 

// This will popup "undefined" 
alert(myvar) 

</script> 
+0

OK, vì vậy, điều này có liên quan đến việc nâng cẩu. Dường như chỉ có trên IE. – Claudio

+0

ví dụ về jsbin: http://jsbin.com/upexat/6/edit#source và một phiên bản khác http://jsbin.com/upexat/8/edit#source – Ajaxe

1

Có nhiều hơn một chút quá nó hơn Alex nói (mặc dù anh chỉ tham chiếu bài viết của tôi - cảm ơn!).

Nếu chuỗi mã nằm trong trình tự xuất hiện, "var myVar" sẽ không bị treo (hoặc cẩu của nó sẽ không có hiệu lực) vì "window.myvar = 150" là được xác định trước (hơn thế nữa sẽ không ' t giải thích lý do tại sao ví dụ đầu tiên hoạt động và thứ hai chỉ thất bại trong IE)

Dường như tập lệnh thứ hai (bằng cách nào đó) tải trước phiên bản đầu tiên - nhưng chỉ trong IE8. Bạn có thể mô phỏng chuyển đổi chuỗi thẻ và bạn sẽ thấy cảnh báo không xác định trong tất cả các trình duyệt

var myvar; 

if (false) { 
    myvar = 3; 
} 

alert(myvar) 

window.myvar = 150; 
Các vấn đề liên quan