görünümü günceller Eğik Js, oldukça standart yöntemin bu örneği düşünün: Bu elbette varsayımsal örnekBu AJAX kalıbı bir bellek sızıntısı mı?
$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... :-(";
});
};
, ama güzel içinden yerel değişkenlerin kazanımına olarak tarif edilebilir biçimini göstermektedir AJAX geri aramalar. Her iki işleyicileri (success
ve error
) doğrudan geri arama eylemcilerden başvuruda bulunulan hugeData
üzerinde bir kapatma oluştururken içinde Tabii
.
Sorum şu ki: AJAX çağrısı sonucu yalnızca başarı veya başarısızlık olabileceğinden, bu kodun yeniden kullanılması zaman içinde bellek sızıntısına neden oluyor? "Evet" cevabını verirdim, ancak bunu yerel testlerimde güvenilir bir şekilde kanıtlayamadım.
Daha deneyimli bazı gurular için bunu benim için açıklamak istiyorum. Günlük olarak Angular ile çalışan herkesin yanıtını çok isterim, ancak herhangi bir jQuery yanıtı da kabul edilir. Eğer fetchResults
dış kapsam içine (hugeData
erişimi olan ya da her türlü nesne veya fonksiyonu) $http()
çağrısının sonucu döndüren olarak
"Bellek sızıntısı", ayrılan ve sonradan hiç serbest bırakılmayan belleğe başvuran çok özel bir terimdir. Sadece bellek yönetiminin manuel olarak yapıldığı bağlamlar için geçerlidir. JS yönetiminin programlayıcıya saydam olduğu göz önünde bulundurulduğunda, bellek sızıntıları yalnızca, IE'nin eski sürümlerinde olduğu gibi, buggy uygulamasının belirli koşullar altında bellek sızıntısına neden olan kodlama kalıpları hakkında konuşursak ilgili olur. Sorunun yazılı olarak anlamlı olup olmadığından emin değilim. – Jon
@ Jon'un yorumuna katılmıyorum. Kötü bir uygulama, global kapsamdaki nesneleri doldurmak gibi, bellek sızıntılarına neden olabilir. Bu durumda, geri arama bittiğinde ($ http örneği temizlenir) devData değişkeni silinir. yukarı) – rewritten
@Jon, şeffaf bellek yönetimi ile herhangi bir dilde kolayca bir bellek sızıntısı yaratabilirsiniz. Java, Scala, JavaScript, C#, siz adını verin. @rewritten, tam olarak bahsettiğim şey bu. Success() 'bitirdiğinde" hugeData "öğesinin silindiğini nereden biliyorsunuz? Dil açısından, 'error()' de kullanılan kapama, ileride daha ileride yürütülebilir. Angular, kaputun altında bir şey yapmazsa (biri bittiğinde diğer geri dönüşü geçersiz kılmak gibi), o zaman burada bir bellek sızıntısı olabilir. –