나는 잡지를 스매싱하면서 블로그를 읽었으며, 닫는 부분은 addy osmani memory efficient JS입니다. 나는 다음 함수가 largeStr에 대한 참조를 보유하고 있으며 GC가 그것을 주장 할 수 없다는 것을 이해한다.설명 Addy Osmani의 스매싱 잡지의 클로저 메모리 누수 예제
var a = function() {
var largeStr = new Array(1000000).join('x');
return function() {
return largeStr;
};
}();
여기에서 언급 한 해결책은 largeStr에 대한 참조를 보유하지 않으며 GC가이를 청구 할 수 있습니다. 대신 그는 smallStr을 사용합니다.
var a = function() {
var smallStr = 'x';
var largeStr = new Array(1000000).join('x');
return function (n) {
return smallStr;
};
}();
큰 물건에 대한 참조가없는 Addy의 요지가 있습니다. 그러나, 나는 거기에 어떤 (더 나은) 방법이 궁금 해서요, 나는 첫 번째 기능의 기능을 가지고 그것을 효율적으로 메모리를 만들 수 있습니다.
이 기사는 두 기능이 동일한 것을한다는 것을 의미하지는 않습니다. 그것들은 단지 예일뿐입니다. 하지만 반환 된 함수에 큰 문자열을 생성하는 코드를 옮길 수는 있습니다. 그것은 매번 새로운 것을 만들 것입니다. – Pointy
같은 변형을 반복해서 만드는 것은 좋은 생각이 아닙니다. 하나의 글로벌 더 나은 것입니다 (처리 시간을 제외하고 ...) 사실 나는 이것을 설명하고 있었고 궁극적 인 해결책이 될 것이라고 궁금해. – KhanSharp
글자가 어떻게되는지에 따라 다릅니다. 코드에 문자열이 거의 필요하지 않고 짧은 시간 동안 만 필요하면 매번 새로운 복사본을 만드는 것이 좋습니다. 코드가 자주 필요하다면 첫 번째 버전은 아마도 OK 일 것입니다 (그리고 전역 변수보다 낫습니다). – Pointy