해결된 질문
작성
·
202
0
192페이지의
'예제 7-9에서는 즉시실행함수 내부에서 Bridge를 선언해서 이를 클로저로 활용함으로써 메모리에 불필요한 함수 선언을 줄였습니다.'부분에 관한 질문입니다!
메모리에 불필요한 함수 선언을 줄였다는 부분이 잘 이해가 되지 않습니다
1.즉시실행함수가 실행되면 즉시실행함수의 컨텍스트가 활성화되고,
2.즉시실행함수의 렉시컬 환경의 환경 레코드에 Bridge와 (return으로 반환되는)함수 선언문이 담기며,
3.Bridge에 빈 함수가 할당되고,
4.익명함수를 반환하며 즉시실행함수의 컨텍스트가 종료.
5.반환된 함수에서 Bridge를 참조하고 있기 때문에 가비지 컬렉터가 Bridge를 수거하지 않음.
저는 이렇게 이해했는데요, 선생님의 표현을 빌리자면 이 Bridge가 메모리 '소모'를 하고 있는 것이죠...?
이그렇다면 이 때 메모리에 불필요한 함수 선언을 줄였다는 것이 어떤 상황과 대비했을 때를 말하는 것인지 잘 모르겠습니다 ㅠ
1. 클로저를 활용한 것이 메모리에 불필요한 함수 선언을 줄였다.
2. 함수 표현식으로 선언할 경우, 전역 컨텍스트의 렉시컬 환경의 환경 레코드에서 그 함수를 참조하고 있으므로, extendClass2에 해당 함수의 실행 결과를 할당하더라도, 전역 컨텍스트가 종료되기 이전에는 여전히 해당 함수가 메모리를 차지하고 있다.
작성하다 보니 2번일 것 같기는 한데 확신이 들지 않아 여쭤봅니다 ㅠㅠ
답변 2
1
1번입니다.
'범용성'을 고려한 결과로,
여러개의 클래스를 만드는 경우 Bridge함수를 매번 새로 만들지 않아도 됨을 의미한 것입니다.
클로저는 이처럼 한 번 만들어둔 것을 여러 상황에서 계속해서 사용하고자 할 때 유용합니다.
var Rectangle = function(width, height) {
this.width = width;
this.height = height;
}
Rectangle.prototype.getArea = function() {
return this.width * this.height;
}
/* extendClass 미이용시 */
var Square = function(width) {
this.width = width;
this.height = width;
}
var SquareBridge = function() {}
SquareBridge.prototype = Rectangle.prototype;
Square.prototype = new SquareBridge();
var Triangle = function(width, height) {
this.width = width;
this.height = height / 2;
}
var TriangleBridge = function() {}
TriangleBridge.prototype = Rectangle.prototype;
Triangle.prototype = new TriangleBridge();
var sq = new Square(10);
var tr = new Triangle(10, 10);
/* extendClass 이용시 */
var extendClass = (function() {
var Bridge = function() {}
return function(SuperClass, SubClass) {
Bridge.prototype = SuperClass.prototype;
SubClass.prototype = new Bridge();
return SubClass;
}
})();
var Square = extendClass(Rectangle, function(width) {
this.width = width;
this.height = width;
});
var Triangle = extendClass(Rectangle, function(width, height) {
this.width = width;
this.height = height / 2;
});
var sq = new Square(10);
var tr = new Triangle(10, 10);
물론 미이용시의 경우에도 Bridge를 한 번만 선언하고 계속 사용하면 동작에서의 문제는 없긴 하지만,
코드 본문의 내용과 특별한 연관이 없이 그저 프로토타입 체이닝 연결만을 목적으로 하는 함수를
굳이 외부에 노출시키지 않고 DRY한 코드를 유지하기 위한 목적도 있습니다.
0