2009-08-31 42 views
10

Tôi đã sử dụng $ .each để thực hiện lặp lại trong một thời gian, nhưng tôi tiếp tục nghe mọi người nói để sử dụng JS gốc để làm các vòng lặp. Tôi rất quan tâm đến hiệu suất nhưng tôi không chắc chắn nếu nó luôn luôn có thể thay thế $ .each với một cách có ý nghĩa.Thay thế mỗi jQuery bằng

Vì vậy, câu hỏi của tôi là, có thể luôn luôn thay thế $ .each với, và nếu không phải là quy tắc của ngón tay cái cho khi nó có thể được thực hiện và khi nó không thể.

Tôi có một từng như thế này:

$this.find("div.class").each(function(){ 
    var $thisparent = $(this).parent(); 

    if (condition) {   
    $(this).prepend($thisparent.text()); 
    } 

    if (condition2) {   
    $(this).prepend($thisparent.text()); 
    } 

}); 

Trả lời

9

Đây là những gì jQuery làm với .each, cơ bản:

$.fn.each = function(callback) { 
    var i, length = this.length; 
    for(i = 0; i < length; ++i) { 
     callback.call(this[i]); 
    } 
}; 

Vì vậy, thật khó để thay thế 'nội dung' của hàm ẩn danh bằng cuộc gọi callback.call. Chỉ cần chắc chắn thay thế this bằng một tạm thời với đối tượng jQuery.

Chuyển đổi mã được cung cấp của bạn:

var foo = $this.find("div.class"), 
    fooLength = foo.length, 
    i, 
    $thisparent; 

for (i = 0; i < fooLength; ++i) { 
    $thisparent = $(foo[i]).parent(); 

    if (condition) {   
     $(foo[i]).prepend($thisparent.text()); 
    } 

    if (condition2) {   
     $(foo[i]).prepend($thisparent.text()); 
    } 
} 

Để biết thêm tốc độ (tiềm năng), bộ nhớ cache foo[i] thành một tạm thời. và chỉ gán $thisparent khi cần. Nếu conditioncondition2 loại trừ lẫn nhau, hãy sử dụng một đơn if (condition || condition2).

+0

Cảm ơn rất nhiều, nhưng bạn có thể vui lòng cung cấp một ví dụ không? Cảm ơn. – Mark

+0

Cảm ơn bạn rất nhiều, :) câu trả lời tuyệt vời và cảm ơn sự gia tăng sự hiểu biết của tôi. Bạn có thể chứng minh làm thế nào để sử dụng một đơn nếu? Ngoài ra nếu tôi có một nửa tá điều kiện loại trừ lẫn nhau. – Mark

+0

@Mark, Đọc trên || toán tử (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators). – strager

5

Có người đã so sánh hiệu suất của for$.each:

http://jquery-howto.blogspot.com/2009/06/javascript-for-loop-vs-jquery-each.html

+0

Vì vậy, rõ ràng bạn chỉ mất một hiệu suất đáng kể với các mảng lớn. Tốt để biết. – Joel

+1

Tôi nghĩ lý do đằng sau đây là phí của các cuộc gọi hàm, vì mã 'mỗi' của jQuery không quá nặng nề. – strager

+2

Sau đó, điều gì về điều này: http://www.youtube.com/watch?v=mHtdZgou0qU#t=24m00s – Mark