인프런 커뮤니티 질문&답변

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

코어 자바스크립트

코어 자바스크립트 질문입니다!

해결된 질문

작성

·

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

boutime2017님의 프로필 이미지
boutime2017
질문자

완전히 맥락을 못잡고 있었네요;; 비교 예제를 들어주시니 이해가 됐습니다! 빠른 답변 감사드립니다!

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

질문하기