inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Nghiên cứu chuyên sâu về JavaScript hiện đại

24. Đóng cửa

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

Đã giải quyết

551

cloer

11 câu hỏi đã được viết

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번째 줄)을 참조한다고 생각했고 결과가 달라 고민한 결과 위와 같이 결론을 내렸습니다. 제가 잘 이해한 것인지 확인받고싶어 질문 드렸습니다. 다시한번 강의와 무관한 질문 드려 죄송합니다.

코어자바스크립트 javascript 클로저

Câu trả lời 3

1

jaenam

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

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

0

cloer

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

0

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

jaenam

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

강의가 누락된것 같습니다.

0

15

2

용어 발음법이 계속 바뀌는 것 같은데 이런 부분들 개선이 가능할까요...?

0

29

1

counter01.html은 어디있을까요?

1

16

1

존재하지 않는 일기 url입력 시 alert이 두 번 떠요

0

33

1

useState 직접 구현 부분에서 질문이 있습니다.

1

35

1

학습을 하고 블로그에 정리를 해도 괜찮을까요?

1

38

1

교재(3쇄)와 강의 내용 문의

0

34

2

섹션2번 부분 강의 화면이 잘 못된것 같아서 문의합니다.

0

23

1

call stack 표현이 잘못표현된것이 아닌가요?

0

76

2

React 와 Virtual DOM 의 이야기 영상 실행이 안됩니다.

0

35

1

일반 강의와 차이점?

1

55

1

!= 연산자의 역할

0

35

1

중요하진 않지만 설명하신부분에서 안된부분..

1

38

1

강의 듣는 순서가 어떻게 되나요?

0

53

1

stopPropagation()에 대해서 질문 있습니다.

0

52

2

12.13) 하단 여백 스타일링 관련 질문 드립니다.

0

67

2

27강 Context내 RSC 사용 관련 문의

0

86

3

혹시 다음 강의 제작 예정된 것들이 있을까요?

0

92

1

브라우저의 ES6 모듈(ESM)을 사용하도록 Babel을 설정

0

282

2

할당문

0

337

1

함수 부분 질문입니다.

0

502

1

생성자 함수를 즉시실행함수로 감싸는 이유가 궁금합니다.

1

823

1

실행컨텍스트에서 BindingObject를 통한 객체의 프로퍼티와 메서드 질문

0

584

1

안녕하세요.

0

462

1