Computer >> Máy Tính >  >> Lập trình >> Javascript

Làm cách nào để quên bộ hẹn giờ hoặc lệnh gọi lại gây rò rỉ bộ nhớ trong JavaScript?

Quên hẹn giờ / gọi lại

Có hai sự kiện định thời trong javascript là setTimeout () và setInterval (). Cái trước thực thi một chức năng sau khi đợi một số mili giây được chỉ định, trong khi cái sau thực thi một chức năng theo định kỳ (lặp lại trong mỗi khoảng thời gian nhất định).

Khi bất kỳ đối tượng nào được liên kết với một lệnh gọi lại của bộ hẹn giờ, nó sẽ không được giải phóng cho đến khi thời gian chờ xảy ra. Trong trường hợp này, bộ hẹn giờ tự đặt lại và chạy mãi mãi cho đến khi hết thời gian chờ ở đó bằng cách không cho phép bộ thu gom rác xóa bộ nhớ. Các bộ hẹn giờ này là nguyên nhân thường xuyên nhất gây ra rò rỉ bộ nhớ trong javascript.

Ví dụ

Trong ví dụ sau, lệnh gọi lại của bộ hẹn giờ và đối tượng bị ràng buộc của nó (bindObject) sẽ không được giải phóng cho đến khi hết thời gian chờ. Trong thời gian trung bình, bộ đếm thời gian tự đặt lại và chạy mãi mãi và do đó không gian bộ nhớ của nó sẽ không bao giờ được thu thập ngay cả khi không có tham chiếu đến đối tượng ban đầu.

<html>
<body>
<script>
   for (var i = 0; i < 100000; i++) {
   var tiedObject = {
   callAgain: function() {
      var text = this;
      var value = setTimeout(function() {
      text.callAgain();
      }, 100000);
   }
   }
   tiedObject.callAgain();
   tiedObject = null;
   }
</script>
</body>>
</html>

Tránh rò rỉ bộ nhớ

1.Để tránh rò rỉ, hãy cung cấp các tham chiếu bên trong setInterval () / setTimeout () để các hàm cần được thực thi trước khi chúng có thể được thu gom.

2. Gọi điện trực tiếp để xóa các chức năng khi chúng không còn cần thiết nữa.

Ngoại trừ các trình duyệt cũ như IE, hầu hết các trình duyệt hiện đại như chrome, v.v. sẽ không gặp phải những vấn đề này. Quan trọng hơn các thư viện như jquery xử lý nội bộ để đảm bảo rằng không có vấn đề rò rỉ nào được tạo ra.