2012-03-07 21 views
56

tôi đã nhận thấy jQuery và có liên quan bổ sung chủ đạo như jQuery.UI qua undefined như một tham số vào các chức năng ẩn danh được sử dụng trong định nghĩa mô-đun của họ, như vậy:Mục đích của việc chuyển giao không xác định là gì?

(function($, undefined) { ... })(jQuery); 

Ngoài ra, tôi đã nhận thấy các plugin khác được đề nghị bởi jQuery và/hoặc những người khác KHÔNG vượt qua undefined trong như một tham số.

Đây có thể là câu hỏi ngớ ngẩn, nhưng ...

Không phải lúc nào cũng có sẵn? Tại sao vượt qua nó? Có một số loại mục đích hay mẹo khác đang diễn ra ở đây không?

Trả lời

68

Có hai lý do cho điều đó:

1) Nếu undefined là một biến trong phạm vi chức năng chứ không phải là một tài sản đối tượng toàn cầu, minifiers có thể giảm nó đến một chữ cái do đó đạt được một tỷ lệ nén tốt hơn.

2) Trước ES5 *, undefined là thuộc tính của đối tượng chung mà không có tính năng chống ghi. Vì vậy, nó có thể được ghi đè, dẫn đến hành vi kỳ lạ và bất ngờ. Bạn có thể làm một cái gì đó như thế này:

var test = 123; 
undefined = 123; 
if (test === undefined){ 
    // this will actually be true, since undefined now equals 123 
} 

Bởi có một cuộc tranh cãi chức năng undefined (tên thực sự không quan trọng) mà bạn không vượt qua một tham số, bạn có thể chắc chắn rằng bạn có một biến mà thực sự là undefined vì vậy bạn có thể kiểm tra "undefinedness" chống lại biến này.

Btw.phương pháp an toàn nhất để kiểm tra xác định là: typeof (var) === 'undefined'

(*) Với ECMAScript 5, các tính chất toàn cầu undefined, NaNInfinity trở thành readonly. Vì vậy, với việc áp dụng chung của nó trong tất cả các trình duyệt hiện đại - tất nhiên ngoại trừ IE 9 - ghi đè những giá trị đó là không thể nữa.

+5

Lý do jQuery sử dụng phương pháp này thay vì 'typeof' là nó nén tốt hơn nhiều trong trình chỉnh sửa Javascript. – interjay

+1

Thats true, tuy nhiên typeof là phương pháp an toàn nhất. Bạn cũng có thể sử dụng bản chất giả của undefined, đó sẽ là kiểm tra ngắn nhất cho 'undefined' nhưng bị che khuất bởi sự tồn tại của các giá trị khác. – Christoph

16

Điều đó được thực hiện để đảm bảo rằng không xác định luôn luôn là undefined. Trong các phiên bản cũ của thông số ECMAScript (trước ECMAScript 5), undefined không phải là một từ dành riêng mà là một biến thông thường. Trong trình duyệt cũ này sẽ được phép ví dụ:

undefined = 2; // Assign a different value to undefined 

// Now this statement would be true 
if (undefined == 2) 

Vì vậy, để đảm bảo rằng không xác định là trong thực tế không xác định, ngay cả khi một số khác "ác" kịch bản sẽ bố trí không xác định với giá trị khác, bạn tạo một tham số mà bạn gọi undefined, và sau đó khi bạn gọi hàm, bạn đảm bảo không truyền giá trị cho tham số đó - do đó bạn có thể chắc chắn rằng biến không xác định sẽ luôn được xác định trong hàm của bạn.

Vì vậy, trong trường hợp của jQuery:

(function($, undefined) { ... })(jQuery); 

Họ vượt qua trong jQuery và gán nó vào biến $ cho thuận tiện, nhưng sau đó họ không vượt qua một giá trị thứ hai để tham số không xác định, do đó không xác định di chúc không được xác định.

Trình duyệt hiện tại

Trong trình duyệt hiện đại, undefined là một tổ chức phi cấu hình tài sản, không ghi theo ECMAScript 5 specification.

10

undefined không phải là một từ dành riêng trong javascript, nó chỉ đơn giản là một biến. jQuery đảm bảo rằng nếu một số nhà phát triển xấu ghi đè giá trị của undefined trong javascript của họ, thì jQuery sẽ bỏ qua nó và thiết lập biến riêng của nó, undefined, không bao giờ được chuyển một giá trị (xem tự thực thi (jQuery) ở cuối) và do đó thực sự không được xác định.

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