2012-08-15 15 views
8

Chúng tôi nhận thấy phương pháp này sử dụng tất cả các thời gian:Đối tượng cửa sổ JavaScript có thể truy cập được không?

(function (window) { 
    var document = window.document, 
     location = window.location, 
     navigator = window.navigator; 
})(window) 

Khi nghiên cứu trên đoạn mã tôi tự hỏi tại sao một đối tượng truy cập trên toàn cầu như window được thông qua như là một cuộc tranh cãi với một hàm. Có thể là:

  1. Nhà phát triển không thể chắc chắn 100% biết cửa sổ đó có thể truy cập từ trong phạm vi chức năng cục bộ không?
  2. Thực hành tốt là vì bạn có ý định rõ ràng với các nhà phát triển khác đọc mã của bạn.
  3. Bạn đã thấy John Resig làm điều đó vì vậy nó phải là ngón tay lickin 'tốt!

Bạn nghĩ sao?

+2

Trùng lặp: http://stackoverflow.com/questions/2716069/how-does-this-javascript-jquery-syntax-work-function-window-undefined –

+0

Có, có vẻ như bạn đã đúng về điều đó một. – ChrisRich

Trả lời

4

Nó làm cho mã dễ dàng hơn.

Bạn có thể sao chép và dán mã vào môi trường không có đối tượng cửa sổ chung được xác định (ví dụ: nút), nhưng API tương thích với tất cả những thứ bạn quan tâm bên trong mã của bạn. Sau đó, bạn chỉ phải sửa đổi đối số được truyền cho hàm.

Một sửa đổi chút ít mà làm cho mã rõ ràng hơn:

(function(root){ 
    var document = root.document, 
     location = root.location, 
     navigator = root.navigator; 
})(window) 
2

Tôi biết một vài lý do có thể cho mã bạn hỏi về:

  1. Tạo phím tắt cho document, locationnavigator trong các biến cục bộ có khả năng cải thiện hiệu suất nhỏ và giảm khả năng nhập.

  2. Chuyển window vào chức năng tự thực thi có thể làm tham chiếu đến window để thực hiện tốt hơn một chút so với sử dụng nó từ không gian toàn cầu.

  3. Có một số môi trường thực thi cho javascript (không phải trong trình duyệt) trong đó đối tượng chung không được gọi là window để mã có thể dễ dàng điều chỉnh hơn. Tuy nhiên, lý do này có vẻ như một chút của một căng để có thể tồn tại vì mã được viết cho một trình duyệt có nhiều khả năng sử dụng khả năng trình duyệt khác anyway.

0
(function ($) { }(jQuery)); // $ stands for jQuery within this function 
(function (window) { }(window)); // window still equals window 
(function (bananas) { }(document)); // all references to bananas => document. (silly) 
  1. Thông thường tên đầu là những gì bạn muốn nó được đặt tên, trong khi phía dưới đảm bảo những gì nó là vụ phải đại diện. Vì vậy, có $ trong đầu có nghĩa là tất cả các mã jQuery của bạn (trong trường hợp này) vẫn còn với jQuery. Sử dụng nó cho cửa sổ/cửa sổ chỉ đảm bảo rằng không có định nghĩa khác của cửa sổ thay đổi ý định ban đầu của nó như là 'cửa sổ'.
  2. Đây chắc chắn là cách thực hành tốt nhất và được kiểm soát theo cách cho phép những gì bạn muốn bên trong không gian tên/chức năng ẩn danh của bạn.
  3. Một trong những lý do! Resig là người đàn ông.