Động cơ hiện đại sẽ không duy trì các biến không sử dụng trong phạm vi bên ngoài.
Do đó, bạn không đặt data = null
trước khi trả về hàm bên trong, vì hàm bên trong không phụ thuộc vào ("đóng cửa") data
.
Nếu chức năng bên trong đã phụ thuộc vào data
--perhaps nó sẽ trả về nó - sau đó thiết lập data = null
chắc chắn là không những gì bạn muốn, bởi vì sau đó, tốt, nó sẽ được null thay vì có giá trị ban đầu của nó !
Giả sử hàm bên trong phụ thuộc vào data
, sau đó có, miễn là inner
đang được trỏ đến (được gọi bởi) một cái gì đó, thì giá trị của data
sẽ phải được giữ lại. Nhưng, đó là những gì bạn đang nói bạn muốn! Làm thế nào bạn có thể có một cái gì đó có sẵn mà không có nó có sẵn?
Hãy nhớ rằng tại một số thời điểm, biến giữ giá trị trả lại là f()
sẽ tự thoát khỏi phạm vi. Tại thời điểm đó, ít nhất cho đến khi f()
được gọi lại, data
sẽ bị thu gom rác.
Quy tắc chung là bạn không cần phải lo lắng về bộ nhớ và rò rỉ với JavaScript. Đó là toàn bộ điểm của GC. Người thu gom rác thải làm một công việc tuyệt vời để xác định cái gì là cần thiết và cái gì không cần thiết, và giữ cái cũ và rác thu thập cái sau.
Bạn có thể muốn xem xét ví dụ sau:
function foo() {
var x = 1;
return function() { debugger; return 1; };
}
function bar() {
var x = 1;
return function() { debugger; return x; };
}
foo()();
bar()();
Và kiểm tra thực hiện của nó trong Chrome DevTools cửa sổ biến. Khi trình gỡ lỗi dừng ở hàm bên trong của foo
, lưu ý rằng x
không có mặt dưới dạng biến cục bộ hoặc dưới dạng đóng. Đối với tất cả các mục đích thực tế, nó không tồn tại.
Khi trình gỡ lỗi dừng trong chức năng bên trong của bar
, chúng ta sẽ thấy biến số x
, vì nó phải được giữ nguyên để có thể truy cập để được trả lại.
Điều này có đúng không? Hay bài viết này đã lỗi thời?
Không, không, và có, đúng vậy. Bài viết là bốn tuổi, là một đời trong thế giới web. Tôi không có cách nào để biết nếu jQuery vẫn còn bị rò rỉ, nhưng tôi sẽ ngạc nhiên nếu nó được, và nếu như vậy, có một cách dễ dàng, đủ để tránh chúng - không sử dụng jQuery. Việc rò rỉ tác giả của bài viết đề cập đến các vòng lặp DOM và trình xử lý sự kiện không có trong các trình duyệt hiện đại, theo đó tôi có nghĩa là IE10 (nhiều khả năng là IE9) trở lên. Tôi khuyên bạn nên tìm kiếm một tài liệu tham khảo cập nhật hơn nếu bạn thực sự muốn hiểu về rò rỉ bộ nhớ. Trên thực tế, tôi đề nghị bạn chủ yếu là ngừng lo lắng về rò rỉ bộ nhớ. Chúng chỉ xuất hiện trong những tình huống rất chuyên biệt. Thật khó để tìm thấy nhiều về chủ đề trên web những ngày này vì lý do chính xác đó. Dưới đây là một bài viết tôi đã tìm thấy: http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html.
Cảm ơn torazaburo. Điều làm tôi lo lắng là đoạn cuối cùng trong bài viết bạn đã cung cấp về lỗi Meteor thực sự làm rò rỉ bộ nhớ trong V8. – Jonathan
"Trên thực tế, tôi đề nghị bạn chủ yếu ngừng lo lắng về rò rỉ bộ nhớ. Chúng chỉ xảy ra trong những tình huống rất chuyên biệt". Tôi mạnh mẽ không đồng ý với tuyên bố này. Ít nhất các DOM tách rời là một sự xuất hiện thường xuyên trong các SPA và mọi nhà phát triển đều phải biết về nó. –