코어 자바스크립트 질문입니다!
192페이지의
'예제 7-9에서는 즉시실행함수 내부에서 Bridge를 선언해서 이를 클로저로 활용함으로써 메모리에 불필요한 함수 선언을 줄였습니다.'부분에 관한 질문입니다!
메모리에 불필요한 함수 선언을 줄였다는 부분이 잘 이해가 되지 않습니다
1.즉시실행함수가 실행되면 즉시실행함수의 컨텍스트가 활성화되고,
2.즉시실행함수의 렉시컬 환경의 환경 레코드에 Bridge와 (return으로 반환되는)함수 선언문이 담기며,
3.Bridge에 빈 함수가 할당되고,
4.익명함수를 반환하며 즉시실행함수의 컨텍스트가 종료.
5.반환된 함수에서 Bridge를 참조하고 있기 때문에 가비지 컬렉터가 Bridge를 수거하지 않음.
저는 이렇게 이해했는데요, 선생님의 표현을 빌리자면 이 Bridge가 메모리 '소모'를 하고 있는 것이죠...?
이그렇다면 이 때 메모리에 불필요한 함수 선언을 줄였다는 것이 어떤 상황과 대비했을 때를 말하는 것인지 잘 모르겠습니다 ㅠ
1. 클로저를 활용한 것이 메모리에 불필요한 함수 선언을 줄였다.
2. 함수 표현식으로 선언할 경우, 전역 컨텍스트의 렉시컬 환경의 환경 레코드에서 그 함수를 참조하고 있으므로, extendClass2에 해당 함수의 실행 결과를 할당하더라도, 전역 컨텍스트가 종료되기 이전에는 여전히 해당 함수가 메모리를 차지하고 있다.
작성하다 보니 2번일 것 같기는 한데 확신이 들지 않아 여쭤봅니다 ㅠㅠ
Answer 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한 코드를 유지하기 위한 목적도 있습니다.
인스턴스에서 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

