Pekala, sanırım ona açık bir atıfta bulunmazsınız, çünkü bu onu ayrılmış kalmaya zorlar.
Aklıma gelen en basit test aslında birçok söz vermek ve bunları çözmemek:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
Ve sonra yığının kendisini izliyor. Chrome profil oluşturma araçlarında görebileceğimiz gibi, bu, 100 söz ayırmak için gerekli belleği biriktirir ve ardından tüm JSFIddle sayfası için 15 megabaytın altında "orada kalır".
Diğer taraftan, kaynak koduna bakarsak$q
Küresel bir noktadan belirli bir söze referans olmadığını, yalnızca bir sözden geri aramalarına referans olduğunu görebiliriz. Kod çok okunabilir ve anlaşılır. Bakalım geri aramadan söze bir referansınız varsa.
var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
for (var i = 0; i < 10; i++) {
var $d = $q.defer();
(function ($d) {
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);
Yani ilk tahsisattan sonra - bunu da halledebilecek gibi görünüyor :)
Son örneğinin birkaç dakika daha çalışmasına izin verirsek, bazı ilginç GC kalıplarını da görebiliriz. Biraz zaman aldığını görebiliriz - ancak geri aramaları temizleyebilir.
Kısacası - en azından modern tarayıcılarda - bunlara dışarıdan referansınız olmadığı sürece çözülmemiş vaatler hakkında endişelenmenize gerek yok