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

cloer님의 프로필 이미지
cloer

작성한 질문수

모던 자바스크립트 딥다이브 스터디

24. 클로저

코어 자바스크립트 예제 5-14 질문

해결된 질문

작성

·

441

0

안녕하세요. 모던 자바스크립트를 읽다가 책이 빠르게 굵직한 부분을 훑고 싶어 강사님의 저서 '코어 자바스크립트'를 읽던 중 질문이 생겨 질문드립니다. 먼저 강의에 관련된 질문이 아닌 점 죄송합니다.

클로저, 135쪽, 예제 5-14, 부분 적용 함수 구현(1)

const partial = function () { // 01
const originalPartialArgs = arguments; // 02
const func = originalPartialArgs[0];
if (typeof func !== "function") {
throw new Error("It's not a function.");
}
return function () { // 07
console.log(arguments);
const partialArgs = Array.prototype.slice.call(originalPartialArgs, 1);
const restArgs = Array.prototype.slice.call(arguments); // 09
return func.apply(this, partialArgs.concat(restArgs));
};
};

1. 9번째 줄의 arguments는 7번째 줄에서 return되는 익명함수의 렉시컬 환경에서 새로 생성된 argument이기 때문에 partial함수의 렉시컬 환경의 arguments(2번째 줄)과 다르다.

2. 7번째 줄에서 익명함수 선언 시 9번째 줄의 arguments는 익명함수의 렉시컬 환경에 수집되어 빈 객체 상태로 익명함수가 return된다.(실행 컨텍스트가 활성화 된느 시점이 아닌 선언 시점에 정보가 수집된다.)

3. 후에 21번째 줄에서 익명함수를 할당받은 addPartial 함수가  22번째 줄에서 호출 될때 7번째 줄의 arguments가 arguments object [6,7,8,9,10]로 재할당 된다.

4. 8번째 줄의 originalPartialArgs가 클로저를 이용한 것이다.

처음에 7번째 줄의 익명함수 속 arguments가 상위 스코프의 arguments(2번째 줄)을 참조한다고 생각했고 결과가 달라 고민한 결과 위와 같이 결론을 내렸습니다. 제가 잘 이해한 것인지 확인받고싶어 질문 드렸습니다. 다시한번 강의와 무관한 질문 드려 죄송합니다.

답변 3

1

정재남님의 프로필 이미지
정재남
지식공유자

전부 맞게 이해하셨습니다.

function 키워드를 사용한 모든 함수는 arguments를 내장합니다.
따라서 상위 스코프의 arguments를 사용하려면 작성하신 대로 originalPartialArgs와 같은 변수에 담아두어야 합니다.

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

설명 감사합니다! 코어 자바스크립트 책과 이 강의모두 잘 보고있습니다. 

0

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

var partial = function () {
var originalPartialArgs = arguments;
var func = originalPartialArgs[0];
if (typeof func !== "function") {
throw new Error("첫 번째 인자가 함수가 아닙니다.");
}
return function () {
var partialArgs = Array.prototype.slice.call(originalPartialArgs, 1);
var restArgs = Array.prototype.slice.call(arguments);
return func.apply(this, partialArgs.concat(restArgs));
};
};

var add = function () {
var result = 0;
for (var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
};
var addPartial = partial(add, 1, 2, 3, 4, 5); // 21
console.log(addPartial(6, 7, 8, 9, 10)); // 22

마지막 두 줄입니다.

0

정재남님의 프로필 이미지
정재남
지식공유자

21, 22번째 줄은 무엇인가요?

cloer님의 프로필 이미지
cloer

작성한 질문수

질문하기