2011-10-04 49 views
7

Trong cấu trúc sau:IIFE bối cảnh vấn đề

(function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

Tại sao this tham khảo window đối tượng? Mọi thứ bên trong IIFE có bị cô lập khỏi phạm vi toàn cầu không? Các hàm xy cũng có thuộc tính của window đối tượng chung?

Ngoài ra, ngay cả khi tôi sử dụng đặt var h = ... ngay từ đầu:

var h = (function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

this vẫn đề cập đến đối tượng cửa sổ - Tôi chỉ có thể gọi show() từ phạm vi toàn cầu! Làm thế nào mà?

Trả lời

9

Ngữ cảnh chung (window trong trình duyệt) là giá trị this nhận khi không có giá trị nào khác để sử dụng.

Biến cục bộ của bạn là cục bộ (nghĩa là, không phải thuộc tính của window). Chúng được khai báo bên trong hàm với var.

Lý do tại sao thêm var h = (function(){... không có sự khác biệt nào là do cách bạn gọi hàm. Tham chiếu hàm không phải là giá trị thuộc tính của một đối tượng (như something.func()) và bạn không gọi nó với .call() hoặc .apply(), do đó, điều này đề cập đến đối tượng chung (window). Đó chỉ là cách ngôn ngữ được định nghĩa để hành động.

8

@Pointy là đúng, nhưng anh ấy không trình bày toàn bộ vấn đề - bạn có thể quan tâm đến this related answer. Vấn đề ở đây là nếu bạn không sử dụng từ khóa new, bạn không khởi tạo một đối tượng, vì vậy không có trường hợp nào cho số this để tham chiếu. Trong trường hợp không có một cá thể, this là đối tượng window.

Nói chung, bạn không cần this trong một IIFE, bởi vì bạn có thể truy cập trực tiếp đến bất kỳ chức năng hoặc biến được định nghĩa trong phạm vi chức năng ẩn danh của - show() có thể gọi x()y() trực tiếp, vì vậy không cần cho một tham chiếu this . Có thể có trường hợp sử dụng hợp lệ để khởi tạo một IIFE với new, nhưng tôi chưa bao giờ gặp nó.

+0

Trường hợp hợp lệ sẽ là khi bạn cần chuyển "điều này" trong một IIFE cho đối tượng khác sử dụng nó để thực hiện cuộc gọi lại. – AndroidDev

Các vấn đề liên quan