inflearn logo
강의

Course

Instructor

Core JavaScript

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

Resolved

270

boutime2017

16 asked

0

192페이지의 

'예제 7-9에서는 즉시실행함수 내부에서 Bridge를 선언해서 이를 클로저로 활용함으로써 메모리에 불필요한 함수 선언을 줄였습니다.'부분에 관한 질문입니다!

메모리에 불필요한 함수 선언을 줄였다는 부분이 잘 이해가 되지 않습니다

1.즉시실행함수가 실행되면 즉시실행함수의 컨텍스트가 활성화되고,

2.즉시실행함수의 렉시컬 환경의 환경 레코드에 Bridge와 (return으로 반환되는)함수 선언문이 담기며,

3.Bridge에 빈 함수가 할당되고,

4.익명함수를 반환하며 즉시실행함수의 컨텍스트가 종료.

5.반환된 함수에서 Bridge를 참조하고 있기 때문에 가비지 컬렉터가 Bridge를 수거하지 않음.

저는 이렇게 이해했는데요, 선생님의 표현을 빌리자면 이 Bridge가 메모리 '소모'를 하고 있는 것이죠...?

이그렇다면 이 때 메모리에 불필요한 함수 선언을 줄였다는 것이 어떤 상황과 대비했을 때를 말하는 것인지 잘 모르겠습니다 ㅠ

1. 클로저를 활용한 것이 메모리에 불필요한 함수 선언을 줄였다.

2. 함수 표현식으로 선언할 경우, 전역 컨텍스트의 렉시컬 환경의 환경 레코드에서 그 함수를 참조하고 있으므로, extendClass2에 해당 함수의 실행 결과를 할당하더라도, 전역 컨텍스트가 종료되기 이전에는 여전히 해당 함수가 메모리를 차지하고 있다.

작성하다 보니 2번일 것 같기는 한데 확신이 들지 않아 여쭤봅니다 ㅠㅠ 

javascript

Answer 2

1

jaenam

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

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

인스턴스에서 prototype 프로퍼티에 직접 접근해야하는 이유

0

59

1

setTimeout 에서 this

0

80

1

2강부터 영상이 나오지 않습니다.

0

174

1

자바스크립트 주석에 이상한 점이 있어서 문의드립니다.

0

218

2

return 문 안에 여러 함수가 존재하는 것이 이해되지 않습니다.

1

259

1

클래스 static 멤버

1

253

1

실행컨텍스트와 스택프레임

2

566

1

프로토타입으로 상속할때 브릿지 사용 이유

0

320

1

호이스팅 관련 질문

1

335

1

책 66p. 예제 3-2 질문입니다.

0

356

1

강의 내용 10:58 캡슐화 질문입니다.

1

397

1

강의 내용 5:10 질문입니다.

1

422

2

전역 공간에서의 this

0

426

2

18:31 addEventListener의 this

1

479

1

outerEnvironmentReference 질문

1

372

1

실행 컨텍스트와 클로저에 대해 질문드립니다.

1

448

1

Object.prototype.constructor의 [[prototype]] ?

1

658

1

함수를 값으로 할당할 때

2

457

1

15:54 'ddd' 사라지는 오류?

4

375

1

프로토타입 getPrototypeOf(instance).constructor(n,a) 질문입니다.

1

404

1

기본형/가변형 질문입니당

0

332

0

선생님 그러면 섹션 0만 봐도 무방한가요!?

0

335

1

Hoisting과 environmentRecord에 관한 질문입니다.

1

290

1

안녕하세요, 데이터 변경 질문입니다.

0

326

1