2011-12-27 29 views
11

Ai đó có thể giải thích điều này? IE8IE8 `window.fn! == fn`

(function(){ 
    window.foo = function foo(){}; 
    console.log(window.foo === foo); // false 
}()); 
+0

Rất tốt đọc trên 'biểu thức hàm được đặt tên', đó là những gì bạn đã có: http://kangax.github.com/nfe/ – InfinitiesLoop

Trả lời

13

Do lỗi IE, biểu thức hàm được đặt tên tạo một biến riêng biệt foo cục bộ với một bản sao riêng của hàm.

More info:

var f = function g(){}; 
f === g; // false 

Đây là nơi mà mọi thứ đang nhận thú vị. Hay đúng hơn - hoàn toàn là hạt. Ở đây chúng ta đang thấy những mối nguy hiểm của việc phải đối phó với hai đối tượng riêng biệt - làm tăng thêm một trong số chúng rõ ràng là không sửa đổi cái kia; Điều này có thể khá rắc rối nếu bạn quyết định sử dụng cơ chế lưu trữ bộ nhớ đệm và lưu trữ thứ gì đó trong thuộc tính của f, sau đó thử truy cập nó dưới dạng thuộc tính của g, nghĩ rằng đó là đối tượng bạn đang làm việc cùng.

+0

Thật tuyệt vời, cảm ơn. Tôi đã đọc điều đó trước đây nhưng chưa bao giờ bị nó cho đến bây giờ. –

+2

Một lần nữa, javascript là một mớ hỗn độn. –

1

Nếu bạn quan tâm đến việc khắc phục sự cố, điều này sẽ hiệu quả.

(function(){ 
    var f = function foo(){}; 
    window.foo = f; 
    alert(window.foo === f); // false 
}()); 
+4

Hoặc chỉ cần loại bỏ tên – SLaks