2011-10-27 32 views
6
nguồn

Các jQuery được bọc trong một đóng cửa, như thế này:Tại sao hai tham số này trong nguồn jQuery cho?

(function(window, undefined) { 
    //awesome jQuery library code in here 
})(window); 

Tôi không hiểu lý do tại sao một trong các thông số này là cần thiết.

window là biến toàn cầu, tại sao cần phải chuyển vào? Mục đích của việc truyền vào một tham số toàn cầu và truy cập nó bên trong bao đóng có cùng tên là gì?

Thông số undefined là gì? Tại sao không có giá trị nào được chuyển cho nó?

+0

cửa sổ sẽ được sử dụng làm địa phương trong phạm vi này, giúp truy cập nhanh hơn, tôi nghĩ vậy. – Ibu

Trả lời

11

Tôi khá chắc chắn điều này đã được trả lời đã có, nhưng:

  • đi qua trong window a) cho phép mã nén để munge tên (tức là thay thế nó bằng một tên biến duy nhất chữ trong vô danh chức năng) và b) đảm bảo rằng biến tham chiếu đối tượng cửa sổ tại thời điểm thư viện được xác định, chỉ trong trường hợp bất kỳ ai định nghĩa lại window trong phạm vi toàn cục sau khi jQuery được tải.

  • bao gồm undefined như một đối số (nhưng không phải đi qua trong một giá trị) làm điều tương tự cho undefined, cho phép munging biến và tránh các vấn đề nếu biến undefined được định nghĩa lại (yup, Javascript cho phép này).

Tôi tin rằng trong cả hai trường hợp này là nghĩa vụ để tăng tốc độ tham chiếu đến biến, vì nó làm cho cả hai biến toàn cục có sẵn trong phạm vi chức năng, mà người phiên dịch sẽ tìm kiếm trước khi tìm kiếm trong phạm vi toàn cầu. Nhưng tôi không thể tưởng tượng một cách trung thực rằng sự khác biệt về hiệu suất ở đây là đáng kể - tôi nghĩ vấn đề lớn nhất là tên biến đổi, làm cho mã nhỏ gọn hơn khi được rút gọn.

+0

hoàn toàn hợp lý, +1 – Ibu

+0

Nếu 'cửa sổ' được xác định lại trong phạm vi toàn cầu, nó sẽ không được xác định lại khi bạn chuyển nó vào? –

+2

@PeterOlson - không phải nếu nó được xác định lại sau này - điều này sửa chữa tham chiếu 'window' tại thời điểm thư viện jQuery được tải, do đó, các cửa sổ' window' sẽ không có hiệu lực. Tôi giả sử nếu bạn xác định lại cửa sổ trước khi thư viện tải, điều này sẽ phá vỡ, nhưng sau đó bạn xứng đáng với những gì bạn nhận được :). – nrabinowitz

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