2010-01-15 21 views
44

Đổ so với ghi chú phát hành về jQuery 1.4, tôi đến acrosss $.noop() đó là:

Mô tả: Một chức năng rỗng. (được thêm vào 1.4)

Bạn có thể sử dụng hàm trống này khi bạn muốn truyền xung quanh một hàm sẽ không làm gì cả.

Có lẽ tôi đang thiếu thứ gì đó sâu sắc ở đây, nhưng chính xác thì việc sử dụng thực tế là gì đi qua một hàm trống?

Ví dụ về mã được đánh giá cao.

Trả lời

47

Chức năng này được đề xuất do các vấn đề hiệu suất trên hệ thống nhúng khi sử dụng $.ajax, được báo cáo trong danh sách gửi thư jQuery-Dev. Bạn có thể xem số thread.

Về cơ bản, họ muốn giới thiệu và sử dụng hàm trống duy nhất này, thay vì khai báo các hàm ẩn danh trống xung quanh.

Bây giờ, chức năng này được sử dụng nội bộ trong các mô-đun ajax, eventoffset.

Bạn cũng có thể xem commit khi được giới thiệu.

0

Lý do logic duy nhất là nếu bạn đang gọi hàm thực hiện điều gì đó VÀ gọi hàm khác, và bạn muốn hàm cấp cao hơn thực hiện điều đó mà không cần gọi hàm tham số.

Hầu hết các chức năng của jQuery đều có chức năng tham số, vì vậy bạn không phải chuyển một tham số. Có thể có một hoặc hai trường hợp không đúng - hoặc có thể là hỗ trợ nhà phát triển với mã tùy chỉnh của họ như thế này.

0

Nếu hàm yêu cầu bạn chuyển một hàm làm đối số? Nói ngắn hơn là do_something($.noop) hơn do_something(function(){}).

Mặc dù không phải bởi nhiều ...

... 6 ký tự ...

... yeah, tính năng mà trông khá vô dụng trên thực tế.

+5

Nó tránh được chi phí của một hàm mới. – SLaks

+1

Tôi sẽ không tin vào điều đó, SLaks - hãy kiểm tra mã cho noop trong nguồn: noop: function() {}, – JAL

+3

@Salsa: nhưng nó luôn có cùng chức năng. Ở khắp mọi nơi $ .noop() được sử dụng, nó giống nhau, một cá thể đơn của một hàm không làm gì cả. Tôi nghi ngờ có đủ chi phí trong hầu hết các máy ảo JS cho việc này để tạo ra bất kỳ sự khác biệt đáng chú ý nào, nhưng theo lý thuyết ... – Shog9

3

Có lẽ nếu một số API xấu yêu cầu một hàm làm tham số và bạn không muốn làm bất cứ điều gì trong đó, đây sẽ là một cách hỗ trợ khung làm rõ điều đó.

+1

Thật vậy, đây là cách nó xuất hiện được sử dụng trong chính jQuery - như một trình giữ chỗ rõ ràng khi không có gọi lại thực sự nào. – Shog9

18

Nếu bạn có chức năng chấp nhận chức năng làm tham số và bạn không có mã nào để cung cấp, bạn có thể vượt qua $.noop.

Tôi không thể nghĩ ra bất kỳ trường hợp nào như vậy trong jQuery nơi thông số không phải là tùy chọn ở địa điểm đầu tiên.

Không giống như viết function(){}, đi qua $.noop sẽ không tạo phiên bản chức năng mới, tiết kiệm một chút bộ nhớ. Tuy nhiên, nếu bạn đang truyền nó để sửa đổi đối tượng chức năng (ví dụ: funcParam.id = 2), hãy chuyển qua $.noop sẽ làm mọi thứ lộn xộn.

+0

Thật tuyệt khi không phải kiểm tra mọi thông số chức năng được truyền cho undefined trước khi thực thi, hoặc khi gọi hàm, phải cung cấp hàm() {} mỗi lần. – Anthony

0

Đó hoàn toàn là một sự tiện lợi/thay thế cho function(){} trong ngữ cảnh của các cuộc gọi lại được yêu cầu - Tôi không nghĩ rằng mình sẽ sớm sử dụng nó bất cứ lúc nào.

Tôi đặt cược đội ngũ jQuery đã có một tiếng cười khá lớn khi họ bỏ mặc nó, cũng phục vụ một mục đích hài hước.

0

Có thể hữu ích nếu bạn có chức năng cung cấp chức năng cho các chức năng khác.

Ví dụ: Bạn có Danh sách dữ liệu. Mỗi mục có một Nút làm điều gì đó. "Cái gì đó" có thể khác nhau cho mỗi mục. Bạn có một "FunctionFactory" có trong mục và trả về một hàm.Nếu bạn không muốn nút làm điều gì đó vì bất kỳ lý do gì, thì cách sạch nhất có thể là trả về một hàm rỗng, theo cách đó bạn biết rằng Factory ALWAYS của bạn trả về một hàm.

Tôi không có ví dụ cụ thể cho jQuery, nhưng tôi đoán điều này có thể hữu ích khi được sử dụng trong khối .each hoặc .map.

2

Tôi sử dụng một vài plugin yêu cầu gọi lại, nhưng đối với một số phần, tôi thực sự không muốn sử dụng một cuộc gọi lại nào đó. Vì vậy, tôi đặt vào hàm() {}.

noop được xác định trong nguồn jQuery như

noop: function() {} 

vì vậy nó sẽ phù hợp với bất cứ nơi nào bạn muốn sử dụng một hàm trống, chẳng hạn như ví dụ trên.

8

Real World Ví dụ (cũng gần như):

jQuery.fn.myAwesomeAjax = function(url, complete) { 
    return jQuery.ajax(url || this.url) 
    .complete(complete || jQuery.noop); 
}; 

Sử dụng nó thay vì function(){}

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