2009-10-22 33 views
8

Gần đây tôi đã tự hỏi liệu có sự khác biệt hiệu suất giữa việc lặp lại bộ chọn một lần nữa hay chỉ bằng cách sử dụng var và lưu bộ chọn trong đó và chỉ tham chiếu đến nó .Có sự khác biệt về hiệu suất giữa bộ chọn jquery hay biến số

$('#Element').dothis(); 

$('#Element').dothat(); 

$('#Element').find('a').dothat(); 

hoặc chỉ

var Object = $('#Element'); 

Object.dothis(); 

Object.dothat(); 

$('a', Object).dothat(); 

tôi thích cách thứ hai bởi vì nó trông sạch hơn và duy trì tốt hơn.

+1

Cách thứ hai có thể nhanh hơn khi bạn không quét chỉ mục DOM mỗi lần cho các đối tượng cần thiết. Ngoài ra, như bạn nói, nó chỉ là thực hành mã hóa tốt hơn miễn là tên biến mới đúng phản ánh những gì chúng chứa. –

+0

cũng, để nhớ rằng nó là một đối tượng jQuery, bạn có thể sử dụng $ đối tượng đó là điều tương tự, nhưng bạn luôn biết các đối tượng js của bạn và các đối tượng liên quan đến jquery. – Sinan

Trả lời

7

Chắc chắn có một sự khác biệt về hiệu suất, vì việc sizzle không phải được thực thi mỗi lần, tuy nhiên, đó cũng là một sự khác biệt về chức năng. Nếu dom xảy ra thay đổi giữa các cuộc gọi thứ 1 và thứ 3, đối tượng jQuery được lưu trong bộ nhớ cache sẽ vẫn chứa tập hợp các phần tử cũ. Điều này thường có thể xảy ra nếu bạn đặt bộ nhớ cache và sau đó sử dụng nó trong một cuộc gọi lại.

+0

Bất kỳ ý tưởng nào về cách thực hiện điều đó? Nghĩa là, để lưu trữ bộ chọn trong một biến nhưng nó có tài khoản cho một DOM thay đổi? Tất cả những gì tôi có thể nghĩ là lưu trữ một hàm trả về bộ chọn trong biến (nhưng nó dường như không hoạt động đối với tôi) – donnovan9

+0

Việc vô hiệu hóa một lựa chọn có thể thực sự khó khăn và không ai làm điều đó vì trình duyệt cũ và điều kiện chủng tộc. Cách tốt nhất để làm điều đó, nếu bạn đang viết tất cả các mã thay đổi mái vòm của mình, hãy tự thêm các phần tử vào bộ sưu tập bất cứ khi nào bạn thực hiện thay đổi. Vì vậy, nếu bạn chèn một cái gì đó bạn biết bạn có một bộ sưu tập cho, làm một '$ mycollection.add (newNode);' –

4

Tôi thích cách thứ hai. Nó sẽ là dễ dàng hơn để duy trì mã ngay cả khi id phần tử hoặc lớp thay đổi.

+0

+1 cho "dễ bảo trì mã" – smack0007

3

Có một cách nhanh khác. Nhanh như mã thứ hai của bạn.

$('#Element') 
    .dothis() 
    .dothat() 
    .find('a') 
     .dothat(); 
2

rộng trên phương pháp Ghommey của

var Object = $('#Element'); 

Object 
    .dothis() 
    .dothat() 
    .find('a') 
     .dothat(); 

Nhanh hơn và lưu trữ đối tượng để sử dụng sau này.

1

Lưu trữ kết quả từ bạn lựa chọn jQuery vào biến nhanh hơn. Điều này là do jQuery không cần tra cứu các kết quả mỗi khi bạn cố truy cập chúng.

Tôi đặt cùng một số số liệu hiệu suất: http://jsperf.com/jquery-selectors-vs-stored-variable

Mở Chrome 26.0.1410.63 trên Mac OS X 10.8.2:
Lựa chọn: 40.276 ops/giây
Lưu trữ các biến: 594.031.358 ops/giây

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