Hãy xem xét ví dụ này của phương pháp khá tiêu chuẩn trong góc Js, cập nhật quan điểm:Mẫu AJAX này có bị rò rỉ bộ nhớ không?
$scope.fetchResults = function() {
// Some local variable that will cause creation of closure
var hugeData = serviceX.getMilionRecords();
// Any call to any resource with success and error handlers.
$http({
method: "GET",
url: "/rest-api/bulk-operation-x",
params: { someParam: hugeData.length }
}).success(function() {
var length = hugeData.length;
$scope.reportToUser("Success, that was " + length + " records being processed!";
}).error(function() {
var length = hugeData.length;
$scope.reportToUser("Something went wrong while processing " + length + " records... :-(";
});
};
Đây là khóa học ví dụ giả, nhưng nó độc đáo cho thấy mô hình, có thể được mô tả như tái sử dụng các biến địa phương từ bên trong Gọi lại AJAX.
Tất nhiên trong cả hai trình xử lý (success
và error
) chúng tôi đang tạo một đóng trên hugeData
được tham chiếu trực tiếp từ trình xử lý gọi lại.
Câu hỏi của tôi là: vì kết quả của cuộc gọi AJAX chỉ có thể thành công hay thất bại, việc tái sử dụng mã này có gây ra rò rỉ bộ nhớ theo thời gian không? Tôi sẽ trả lời "có", nhưng tôi không thể chứng minh một cách đáng tin cậy điều này trong các bài kiểm tra địa phương của tôi.
Tôi muốn một số chuyên gia có kinh nghiệm hơn để giải thích vấn đề này cho tôi. Tôi rất thích phản ứng của bất cứ ai làm việc với Angular trên cơ sở hàng ngày, nhưng bất kỳ phản ứng jquery cũng được chào đón.
"Bộ nhớ bị rò rỉ" là một thuật ngữ rất cụ thể đề cập đến bộ nhớ được cấp phát và sau đó không bao giờ được giải phóng. Nó chỉ áp dụng cho các bối cảnh nơi quản lý bộ nhớ được thực hiện thủ công. Cho rằng trong quản lý JS là minh bạch đối với lập trình viên, rò rỉ bộ nhớ chỉ có liên quan nếu nói về các mẫu mã hóa gây ra một lỗi thực hiện để rò rỉ bộ nhớ trong một số trường hợp, như trường hợp với các phiên bản cũ của IE. Tôi không chắc liệu câu hỏi có ý nghĩa như được viết hay không. – Jon
Tôi không đồng ý với nhận xét của @ Jon. Một hành động xấu có thể gây rò rỉ bộ nhớ, như làm đầy các đối tượng trong phạm vi toàn cục, v.v. Trong trường hợp này nó sẽ không, vì biến bigData bị xóa ngay sau khi bất kỳ cuộc gọi lại nào được hoàn thành (và phiên bản http http được làm sạch lên) – rewritten
@Jon, bạn có thể dễ dàng tạo ra một rò rỉ bộ nhớ trong bất kỳ ngôn ngữ nào với quản lý bộ nhớ trong suốt. Java, Scala, JavaScript, C#, bạn đặt tên cho nó. @rewritten, đây chính xác là những gì tôi đang nói đến. Làm thế nào để bạn biết rằng 'bigData' bị xóa khi' success() 'kết thúc? Từ quan điểm ngôn ngữ, việc đóng cửa được sử dụng trong 'error()' có thể được thực hiện tại một số thời điểm sau này trong tương lai. Trừ khi Angular thực hiện điều gì đó dưới mui xe (như vô hiệu hóa các cuộc gọi lại khác khi kết thúc), thì chúng ta có thể bị rò rỉ bộ nhớ ở đây. –