2012-10-10 24 views
5

Gần đây tôi đã đọc trong số this tutorial rằng một số lỗ rò jQuery nhất định có thể theo dõi được thông qua biến số $.cache và bạn luôn phải kiểm tra kích thước của nó nếu quá lớn, bạn đang làm điều gì đó sai.

Vâng, kích thước quá lớn? Có cách nào để kiểm tra một biến để xem có bao nhiêu bộ nhớ đang ăn không?

Tôi đang làm việc trên một trang web lưu trữ 210 đối tượng chỉ bằng cách tải trang chủ. Đó là quá nhiều? Tôi sẽ đánh giá cao một lời giải thích kỹ lưỡng về vấn đề này ở đây.

+0

Nó không phải về cách lớn đó là, nhưng làm thế nào nó phát triển theo thời gian. Nếu bộ nhớ cache không bị chặn (tức là tăng mãi mãi), bạn có thể bị rò rỉ bộ nhớ. –

+1

jQuery thực sự là trình duyệt tương thích. Nó mang đến cho IE vấn đề xử lý đúng các yếu tố cho tất cả các trình duyệt. –

+0

Bạn sẽ bị đẩy mạnh để hạn chế khả năng bộ nhớ hiện đại nếu bạn hợp lý. Trừ khi tất nhiên bạn tạo ra một rò rỉ bộ nhớ đủ lớn. Không có lượng bộ nhớ ảo, tất cả phụ thuộc vào phần cứng của người dùng. Bạn có quan tâm đến những người sử dụng máy tính từ những năm 90 không? –

Trả lời

3

$.cache kích thước theo giá trị khuôn mặt không cho biết bất kỳ điều gì về rò rỉ bộ nhớ. Nó có thể rất nhỏ và vẫn có rò rỉ bộ nhớ, hoặc nó có thể rất lớn và không có bất kỳ rò rỉ bộ nhớ nào.

Nếu bạn biết bạn có 10 trình xử lý sự kiện bị ràng buộc với jQuery trên trang tại một thời điểm, và chưa $.cache có mục nhập để biết thêm, thì bạn biết bạn đang bị rò rỉ.

Trình tiết kiệm bộ nhớ lớn là sử dụng tính năng ủy quyền sự kiện thay vì gắn trình xử lý sự kiện vào từng phần tử riêng lẻ.

Say:

<ul> 
    <li></li> 
    <li></li> 
    <li></li> 
</ul> 

$("li").on("click", fn) sẽ đính kèm 3 xử lý sự kiện cá nhân (thêm, nếu bạn có nhiều li của khóa học), trong khi $("ul").on("click", "li", fn) sẽ đính kèm chỉ là một bất kể có bao nhiêu li-yếu tố mà bạn có và chưa có cùng một kết quả.


Ví dụ về rò rỉ:

$("button").click(function() { 
    $("#target")[0].innerHTML = ""; 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/1/

Lý do được rằng .innerHTML được sử dụng, mà không phải là một phần của jQuery vì vậy nó không thể làm sạch.

Fix là sử dụng phương pháp jQuery cho cùng:

$("button").click(function() { 
    $("#target").html(""); 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/2/

+0

đó là một mẹo hay. nhưng làm thế nào tôi có thể sử dụng biến $ .cache để kiểm tra tốt hơn việc sử dụng bộ nhớ của tôi? Một ví dụ tôi chỉ nghĩ đến: Kiểm tra số lượng phần tử được lưu trong bộ nhớ cache, nhấp vào nút và có hành vi trực quan được mong đợi, kiểm tra số lượng phần tử được lưu trong bộ nhớ cache một lần nữa, nhấp vào nút "đặt lại" hành động trước đó và xem liệu có được lưu trữ không số phần tử giống như ở đầu bài kiểm tra này. Đây có phải là, ví dụ, một sử dụng tốt của $ .cache để kiểm tra việc sử dụng bộ nhớ? – ChuckE

+0

@ChuckE Tôi sẽ không lo lắng về $ .cache, một cách để tránh toàn bộ điều là độc quyền sử dụng sự kiện phái đoàn để các yếu tố tĩnh mà không bao giờ bị loại bỏ ở nơi đầu tiên. Nếu không, chỉ cần đảm bảo rằng bạn luôn sử dụng các phương thức jQuery và không phải là các phương thức DOM chuẩn: http://jsfiddle.net/SGZW4/1/ vs http://jsfiddle.net/SGZW4/2/ – Esailija

+0

humm, thú vị. Vì vậy, có nghĩa là, đối với trường hợp thử nghiệm, $ .cache thậm chí không thể kiểm tra có một rò rỉ bộ nhớ? – ChuckE

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