2014-05-19 15 views
10

Vậy tại sao chúng ta phải nhớ các đối tượng jQuery?Tại sao các đối tượng jQuery cache?

Trong các tình huống sau:

var foo = $('#bar'); 
foo.attr('style','cool'); 
foo.attr('width','123'); 

$('#bar').attr('style','cool'); $('#bar').attr('width','123');

Tại sao là lựa chọn đầu tiên để tốt hơn nhiều so với tùy chọn thứ hai?

Nếu đó là do hiệu suất, làm cách nào để giảm mức sử dụng?

+1

Tôi nghĩ đầu tiên chỉ tốt hơn nếu bạn sử dụng '$ ('# bar')' nhiều lần, trong ví dụ của bạn, nó chỉ được sử dụng 1 lần. Vì vậy, nó không nên có bất kỳ lợi thế ở đây. –

+0

@KingKing, oops, tôi đã chỉnh sửa nó để bao gồm hai hành động. – ThePixelPony

+1

Google là bạn của bạn - https://www.google.com/search?q=cache+jquery+selectors – mplungjan

Trả lời

17

Vì hàm jQuery có nhiều mã trong đó, liên quan đến chi phí không cần thiết nếu bạn thực thi nó nhiều hơn một lần với cùng đầu vào mong đợi các đầu ra tương tự. Bằng cách lưu trữ kết quả, bạn lưu trữ một tham chiếu đến phần tử chính xác hoặc tập hợp các phần tử bạn đang tìm kiếm, do đó bạn không phải tìm kiếm lại toàn bộ DOM (ngay cả khi đó là tìm kiếm khá nhanh). Trong nhiều trường hợp (các trang đơn giản với một lượng nhỏ mã) bạn sẽ không nhận thấy sự khác biệt, nhưng trong trường hợp bạn làm điều đó có thể trở thành một sự khác biệt lớn.

Bạn có thể thấy điều này hoạt động theo testing your example in jsPerf.

Bạn cũng có thể coi nó như một ví dụ về mẫu cấu trúc tái cấu trúc Introduce Explaining Variable cho mục đích dễ đọc, đặc biệt với các ví dụ phức tạp hơn so với ví dụ trong câu hỏi.

+8

Câu trả lời nhiều. Chi tiết như vậy. Rất chấp nhận. Cảm ơn! – ThePixelPony

0

Bộ chọn jQuery $('#foo') tìm kiếm toàn bộ DOM cho (các) phần tử phù hợp và sau đó trả về (các) kết quả.

Lưu các kết quả này có nghĩa là jQuery không phải tìm kiếm DOM mỗi khi bộ chọn được sử dụng.

EDIT: document.getElementById() là những gì jQuery sử dụng để tìm kiếm DOM, nhưng không bao giờ đủ jQuery.

+2

Tinh thần của câu trả lời của bạn là chính xác nhưng trong trường hợp cụ thể của một bộ chọn ID jQuery chỉ sử dụng ['document.getElementById()'] (https://developer.mozilla.org/en-US /docs/Web/API/document.getElementById) –

+0

@JasonSperske Cảm ơn bạn. Tôi sẽ cố gắng sửa câu trả lời của mình. – ThePixelPony

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