2012-10-05 30 views
5

Trích từ JavaScript Object-Oriented Stoyan Stefanov của (trang 84):Đây có phải là tuyên bố đúng đắn về Đóng cửa không?

enter image description here

Nếu bạn đang ở điểm a, bạn đang ở trong không gian toàn cầu. Nếu bạn đang ở điểm b, là bên trong không gian của hàm F, thì bạn có quyền truy cập vào không gian toàn cầu và không gian F. Nếu bạn đang ở điểm c, nằm bên trong hàm N, thì bạn có thể truy cập không gian toàn cầu, không gian F và không gian N Bạn không thể chạm từ a đến b, bởi vì b là vô hình bên ngoài F Nhưng bạn có thể nhận được từ c đến b nếu bạn muốn, hoặc từ N đến b. Các thú vị điều-đóng-xảy ra khi bằng cách nào đó N bùng nổ của F và kết thúc lên trong không gian toàn cầu. "

Tôi nghĩ rằng câu đậm ở trên nên được đổi thành" Nếu bạn đang ở điểm c , bên trong hàm N, sau đó bạn có thể truy cập không gian toàn cục và không gian N "(không gian F không được chứa, vì điểm c chỉ có quyền truy cập vào không gian N và phạm vi toàn cầu G.) .

Am tôi phải không? cảm ơn.

+0

Tại sao bạn không N truy cập vào F? N là bên trong F. Tôi nghĩ rằng bản vẽ là nghĩa vụ phải truyền đạt rằng N đã _declared bên trong và _ trả lại from_ function F. – jahroy

+0

Không nhất thiết phải "trở về từ" @jahroy. Các cơ chế khác tồn tại để tạo một tham chiếu ngoài tới một hàm bên trong, ví dụ gán trực tiếp của nó cho một thành viên bên ngoài hoặc phần đính kèm của nó, như một trình xử lý sự kiện, đến một phần tử DOM. –

Trả lời

1

Như những người khác đã nói, không. Một quan điểm bên ngoài về một hàm bên trong không chỉ duy trì chức năng bên trong còn sống mà còn cho phép nó truy cập môi trường bên ngoài mà nó được tạo ra, ngay cả khi môi trường bên ngoài đó phát sinh từ một hàm thực hiện đã hoàn thành và trả về.

Tôi nghĩ biểu đồ sẽ minh họa tốt hơn việc đóng cửa nếu màu xanh N được hiển thị bên trong F và phiên bản chấm chấm (tham chiếu đến N) được hiển thị bên ngoài F.

Câu cuối cùng của báo cáo kết quả trích dẫn cũng có thể được cải thiện:

Điều thú vị - một đóng cửa - xảy ra khi một tài liệu tham khảo bên ngoài để N tồn tại, bên ngoài F.

Lưu ý rằng phiên bản này tránh đề cập đến không gian toàn cầu. Bất kỳ phạm vi bên ngoài sẽ đủ cho một đóng cửa được hình thành.

Tuyên bố có thể đi xa hơn để nói rằng cơ chế cho phép đóng cửa được hình thành là sự triệt tiêu của Bộ sưu tập rác.

Cảnh báo: Có nhiều định nghĩa và mô tả sai về "đóng cửa", cả trên web và trong sách. Mục nhập thẻ wiki hiện tại của Stack Overflows cho "đóng cửa" là một trường hợp tại điểm.

+0

Chắc chắn, có rất nhiều mô tả xấu về "đóng cửa", nhưng mô tả của bạn ("một đóng cửa ... mà nó đã được tạo ra") là một trong những tốt nhất mà tôi từng đọc. Ngoài ra, tôi cảm thấy việc đóng cửa phải được nắm bắt từ quan điểm "phạm vi chuỗi", chứ không phải so sánh thực hiện với các ngôn ngữ khác (ví dụ: các biến ngăn xếp kiểu C). Bạn có đồng ý không? –

+0

@MattElson, cảm ơn vì nhận xét của các bạn. Cảm giác mạnh nhất của tôi về chủ đề này là bất kỳ định nghĩa nào bắt đầu với "Một đóng cửa là một chức năng ..." bị hủy hoại bởi vì các định nghĩa như vậy không đúng với khái niệm ban đầu của Landin về việc đóng cửa "có một phần môi trường và một phần kiểm soát". Không có nơi nào cho nó ở đây nhưng có một lý do thuyết phục khác để chuyển đi từ mọi thứ "... là một chức năng ..." loại định nghĩa. Một ngày nào đó tôi sẽ nhận được tất cả mọi thứ được viết trong một bài báo và trình bày nó tại một hội nghị. –

2

Không, tôi nghĩ những gì nó nói là N là một chức năng mà đã được trả lại fr om chức năng F, và do đó có quyền truy cập (thông qua một đóng) để biến b được khai báo bên trong F. Ví dụ: (live example):

function F() { 
    var b = 10; 
    return function() { 
     console.log(b); 
    };  
} 

var N = F(); //N is a reference to the anonymous function returned from F 

N(); //logs '10' because we still have access to b (because of the closure) 
+0

Đó chính xác là cách tôi đọc nó: vòng tròn màu xanh (vẽ bên ngoài vòng tròn màu đỏ, nhưng chỉ về phía nó) được cho là đại diện cho một fuction được _returned_ từ F. – jahroy

1

Không, bạn không đúng.

Vòng tròn chấm chấm được cho là đại diện cho phạm vi thực tế của N, như bên trong F.

1

Không, tại điểm c bạn thực sự có quyền truy cập vào không gian F của mình.

Một ví dụ về điều này:

function F() { 

    var b = 42; 

    function N() { 
    alert(b); 
    } 

    return N; 

} 

// get a reference to the function N in the global scope: 
var n = F(); 
n(); // shows 42 
1

Không, bạn không đúng, nhìn vào mã bên dưới.

// the global space 
var g = 'g'; 

function F() { 
    // the F space 
    var a = 'a'; 
    function N() { 
    // the N space 
    // here you could access g in the global space and a in the F space. 
    var c = 'c'; 
    console.log(g, a); 
    } 
} 
Các vấn đề liên quan