2010-02-27 28 views
6

Chức năng cục bộ trong phiên đóng mở một biến có cùng tên tồn tại trong phần đóng. Vì vậy, làm thế nào chúng ta có thể truy cập biến đóng cửa từ chức năng địa phương?Đóng cửa phân biệt và biến cục bộ

function closure() 
{ 
    var xVar; 
    function func1() 
    { 
     var xVar; 
     // how to distinguish local and closure scopes. 
     return xVar; 
    } 
    return function() { return func1(); }; 
} 

Tạo đối tượng riêng tư và biến riêng tư làm thuộc tính của đối tượng này có thể hữu ích. Nhưng tôi tự hỏi nếu có một giải pháp tốt hơn và gọn gàng hơn. Chuỗi phạm vi có thể giúp đỡ không?

Tôi đã chỉnh sửa để đóng cửa hoàn toàn. Dù sao, đóng cửa không phải là nhiều mối quan tâm ở đây, nó có thể được xem xét cho các chức năng bên trong tuy nhiên, có thể có một giải pháp với đóng cửa bằng cách nào đó.

Cảm ơn

Trả lời

3

Bạn không thể truy cập chuỗi phạm vi một cách rõ ràng trong JS. Vấn đề của bạn là vấn đề cũ của bóng đổ biến đổi, nhưng điều đó càng thêm buồn vì trong JS, chuỗi phạm vi thực sự là ở đó khi chạy, nó không có sẵn để bạn truy cập.

Bạn có thể chơi một số thủ thuật với kích hoạt lại phạm vi hiện tại nếu bạn sử dụng toán tử with bị ghét, nhưng điều đó (cũng như của người gọi/callee) của arguments thực sự chỉ cung cấp cho bạn quyền truy cập vào đối tượng và chức năng. Không có cách nào để nói "cho tôi biết xVar nghĩa là gì trong phạm vi thời gian chạy n-1 ngay tại đây".

0

Trong ví dụ của bạn biến xVar không đóng, bởi vì bạn đã xác định lại phạm vi của nó cho từng chức năng. Để sử dụng biến đó như là một đóng, tiếp tục khai báo nó với lệnh var trong hàm closure() và sau đó không khai báo nó với hàm var trong hàm func1(). Thay vào đó, chỉ cần sử dụng biến ngay lập tức trong func1().

Không có cách nào dễ dàng để kiểm tra xem hàm có bị đóng hay biến cục bộ hay không. Bạn sẽ phải thực hiện một số loại kiểm tra dòng chảy kiểm soát và sau đó phân tích các bài tập, nơi bài tập xảy ra, và nơi các bài tập không xảy ra. Sau đó, bạn phải so sánh các kết quả đó. Bạn có thể viết một công cụ, trong JavaScript, để thực hiện phân tích đó trên một đầu vào đã cho và viết cho bạn một báo cáo như đầu ra.

+3

Tôi nghĩ rằng anh ấy biết điều đó. Câu hỏi là, từ mã bên trong "func1" làm thế nào bạn sẽ tham chiếu một cách rõ ràng cho "xVar" được định nghĩa trong "đóng cửa" (và không phải là "xVar" được định nghĩa trong "func1")? – Pointy

+0

Tôi trả lời rằng trong đoạn đầu tiên của tôi. –

1

Các biến được xác định trong phạm vi bên trong ẩn các khai báo biến trong phạm vi bên ngoài. "Giải pháp tốt hơn và gọn gàng" không phải là sử dụng lại các tên biến theo cách đó.

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