2012-06-22 14 views
5

Như một quy ước phong cách Tôi thích được rõ ràng khi tôi truy cập vào các biến trong phạm vi toàn cầu, thíchTôi có nên sử dụng tự hoặc cửa sổ để tham khảo phạm vi toàn cầu không?

window.example = "Hello"; 
window.alert(window.example); 

để ít tiết

example = "Hello"; 
alert(example); 

bây giờ tôi có một mô-đun có thể được sử dụng trực tiếp từ trình duyệt hoặc nếu chúng có sẵn, từ một nhân viên web. Trong công nhân web, đối tượng toàn cầu được gọi là self, trong khi trình duyệt được gọi là window.

Đối tượng window có tự sở hữu, vì vậy self.example = "Hello" sẽ làm việc trong cả hai tình huống, vì vậy miễn là không ai redeclares self (như họ thường làm: var self = this).

Quy ước tốt nhất để làm gì?

  • Sử dụng self và hy vọng không ai khai báo một mâu thuẫn self.
  • Nếu window được xác định, hãy sử dụng window, nếu không hãy sử dụng self.
  • Cái gì khác?

Có suy nghĩ về điều đó, tôi có xu hướng tiếp tục với bước thứ hai.

Trả lời

6

Trong phạm vi toàn cầu, hoặc trong trang hoặc một nhân viên web, bạn có thể viết mã như sau:

(function(global) { 
    // ... whatever 
}(this); 

Sau đó, bên trong chức năng bên ngoài chính bạn có thể sử dụng "toàn cầu" (hoặc gọi nó là "wi" ndow "hoặc" self "hoặc" bất cứ điều gì ") và nó sẽ làm việc trong cả hai bối cảnh (hoặc trong Node.js cho rằng vấn đề).

1

tôi muốn đề nghị

var global; try { global = window } catch(e) { global = self } 
+0

Đáng ngạc nhiên, điều này dường như ném một lỗi tham chiếu khi được sử dụng trong nhân viên web. Chrome cho biết: "ReferenceError: Không thể tìm thấy biến: cửa sổ". Tôi nên đề cập rằng tôi đang sử dụng requireJS để tải mô-đun này từ nhân viên của tôi, vì vậy tôi đoán đó có thể là nguồn gốc của một số sự kỳ quặc. – RichardTowers

+0

xin lỗi, tôi quên việc xử lý khắc nghiệt của một biến không tồn tại. sửa nó. – matt3141

+0

'global = typeof window! ==" undefined "&& window! == null? cửa sổ: tự; 'cũng có vẻ hoạt động không có lỗi. Tôi thực sự thích câu trả lời của @ Pointy. – RichardTowers

0

Bạn có thể tạo tài liệu tham khảo của riêng bạn để một trong hai cửa sổ hoặc tự:

var my_window = window || self; 
+0

Nhưng, trong một webworker, bối cảnh chung không phải là một cửa sổ, do đó, gọi bối cảnh toàn cầu 'my_window' có vẻ gây hiểu nhầm. – jfriend00

+0

Nhà phát triển rõ ràng là tự do đặt tên biến của mình theo ý muốn – jackwanders