2012-06-25 6 views
9

Một chức năng trong javascript tạo thành một đóng bằng cách giữ liên kết (ẩn) với phạm vi kèm theo của nó.Có thể truy cập vào việc đóng một chức năng không?

Có thể truy cập nó theo chương trình khi chúng tôi có chức năng (dưới dạng giá trị biến) không?

Mục tiêu thực sự là lý thuyết nhưng một cuộc biểu tình có thể liệt kê các thuộc tính của việc đóng.

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

//access y here with x somehow 
+0

Mẫu mã sẽ giải thích rõ vấn đề chính xác của bạn – Blaster

+0

Vấn đề là lý thuyết, không thực tế: được đưa ra một hàm, bạn có thể liệt kê các thuộc tính của việc đóng của nó không? –

+0

'console.log (x(). Y); // 5'? – Blaster

Trả lời

4

Đó là (một trong) mục đích đóng cửa - để giữ thông tin riêng tư. Vì hàm đã được thực hiện, các biến phạm vi của nó không còn có sẵn từ bên ngoài (và chưa bao giờ được) - chỉ các hàm được thực hiện trong phạm vi của nó (vẫn còn) có quyền truy cập.

Tuy nhiên, bạn có thể cấp quyền truy cập thông qua getters/setters.

Bạn có thể muốn xem xét Stuart Langridge's talk về bao đóng. Rất được đề nghị cũng là Douglas Crockfords Giải thích. Bạn có thể thực hiện nhiều công cụ lạ mắt với các đóng cửa;)

Chỉnh sửa: Bạn có một số tùy chọn để kiểm tra việc đóng: Xem đối tượng trong bảng điều khiển dành cho nhà phát triển web hoặc (như tôi thường làm) trả về hàm gỡ lỗi tất cả các biến riêng tư cho bảng điều khiển.

3

Không, không, trừ khi bạn tiếp xúc với nó:

var x = function(){ 
     var y = 5; 

     return {    
      getY: function(){ 
       return y; 
      }, 
      setY: function(newY){ 
      y = newY; 
      }  
     } 
    } 


    x.setY(4); 
2

Bạn có thể chỉnh sửa các chức năng cảnh báo:

var x = (function(){ 
    var y = 5; 
    return function() { 
     alert(y); 
    }; 
})(); 

var oldAlert = alert; 

alert = function (x) { 
    oldAlert(x); 
    window.y = x; 
} 

x(); 

console.log(y); // 5 

Hoặc nếu bạn sở hữu mã, bạn có thể sử dụng getters standart và setters.

+6

Heh, + 1 để suy nghĩ bên ngoài hộp. Tôi nghĩ rằng OP muốn có thể kiểm tra tất cả các biến trong đóng cửa mặc dù. – Matt

+0

Tôi chỉ muốn làm cho điểm, rằng đóng cửa không hoàn toàn hộp đen. – jasssonpet