ja przeglądając slajdy w prezentacji: http://slid.es/gruizdevilla/memoryW jaki sposób zamknięcia tworzą wycieki pamięci?
i na jednym ze slajdów, kod ten jest prezentowany z sugestią, że tworzy przeciek pamięci:
var a = function() {
var smallStr = 'x',
largeStr = new Array(1000000).join('x');
return function (n) {
eval(''); //maintains reference to largeStr
return smallStr;
};
}();
Zamknięcia może być inna źródło wycieków pamięci. Dowiedz się, jakie referencje są zachowane w zamknięciu.
I pamiętaj: eval jest zły
Może ktoś wyjaśnić ten problem tutaj?
nie wierzę, że jest wyciek pamięci zdefiniowane przez tę samą prezentację (który powiedział przeciek jest „, gdy program nie zwróci wielokrotnie pamięć uzyskał tymczasowy użytek "), ponieważ nie dzieje się to wielokrotnie. Ale 'largeStr' będzie wiązał fragment pamięci, aż" a "wykracza poza zakres. Również 'eval()' nie jest złe, to prawie zawsze złe narzędzie do tej pracy. – nnnnnn
@nnnnnn: Zwłaszcza tutaj, gdzie 'eval' wydaje się być używany do zapobiegania statycznej analizie kodu, która pozwoliłaby zbieraczowi śmieci na zbieranie' largeStr' nawet wtedy, gdy żywa jest referencja do zwróconej funkcji. – Bergi
@MedicineMan: Czy "* rozumiesz, jakie referencje zostały zachowane w zamknięciu *" czy nie? – Bergi