2011-01-31 55 views
20

Giả sử chúng ta làm điều gì đó như thế này (như một phần của việc xây dựng một đối tượng Javascript):Làm cách nào để kiểm tra các biến đóng bị ràng buộc trong javascript?

var foo = 3; 
this.method = function() { alert(foo); }; 

Bây giờ đóng cửa sẽ được tạo ra để đảm bảo foo được giữ lại và sẵn sàng để sử dụng trong method. Có cách nào để làm nội tâm về việc đóng cửa hiện tại không?

Điều tôi đang tìm là cách liệt kê tất cả các biến có sẵn bên trong method, bao gồm foo. Mã gỡ lỗi như thế này sẽ giúp ích rất nhiều trong việc gỡ lỗi ràng buộc của các bao đóng, nhưng tôi vẫn chưa tìm thấy nó. có khả năng làm cái này không?

Trả lời

10

Bản thân ngôn ngữ không chứa các khả năng như vậy. Trong thực tế, dữ liệu ẩn trong các bao đóng JavaScript là một trong số ít những thứ thực sự riêng tư (trái với dữ liệu "riêng tư" trong C#, C++, Java, vv luôn có thể được truy cập bằng phép thuật hoặc phản xạ con trỏ).

Tóm lại, đây sẽ là điều trình biên dịch. Những gì bạn có thể hy vọng là một công cụ được tích hợp với một trong các trình thông dịch JavaScript chính (hoặc ít nhất là khả năng tích hợp sẵn để cắm một công cụ như vậy vào công cụ cốt lõi). Một trong Firefox/Firebug hoặc V8/Node.js sẽ là tốt đẹp, nhưng tôi tin rằng chúng tôi không may mắn vào lúc này.

7

Kể từ 1.11.2, dòng lệnh của Firebug bao gồm phần mở rộng cú pháp để nhận giá trị foo: this.method.%foo.

Việc đóng toàn bộ cũng có thể được kiểm tra bằng cách bật tùy chọn "Hiển thị đóng cửa" trong bảng điều khiển DOM và mở rộng thuộc tính giả "(đóng cửa)" this.method. Điều này cũng hoạt động trong Chrome (có thuộc tính giả được gọi là <function scope>; không có tiền tố nào cho nó).

0

Có lẽ JavaScript không thực hiện theo mặc định nhưng tôi có thể tưởng tượng cách đọc tất cả thuộc tính từ đối tượng chung (như foo là thuộc tính của nó) và đọc mọi thuộc tính cho đến khi đóng, mặc dù điều này thực sự chậm . Tôi phải nói rằng tôi không biết nhiều về javascript và có lẽ tôi chỉ nói noncences, nhưng có thể bạn sẽ có được một ý tưởng mới từ cách tiếp cận của tôi.

+1

Nếu 'foo' là biến cục bộ (có thể ví dụ của OP là tất cả bên trong một hàm tạo), thì nó sẽ không thể truy cập được từ đối tượng chung. – dpercy

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