호출 방식에 따라 정해지는 this 값을 이해합니다.
일반 메서드를 object.method()로 호출하면 this는 object입니다. 화살표 함수는 자신의 this를 만들지 않고 바깥 값을 사용하며 strict mode의 일반 함수 호출 this는 undefined입니다.
learner.regular()는 점 앞의 learner를 this로 받아 this.name이 호현이 되므로 일반 메서드: 호현을 돌려줍니다. arrow 속성의 화살표 함수는 this를 읽지 않고 고정된 문장만 돌려주므로 두 번째 줄에는 그 문장이 그대로 찍힙니다. 만약 arrow 안에서 this.name을 읽었다면 learner가 아니라 바깥 함수의 this를 보게 되어 호현이 나오지 않습니다.
메서드를 learner.regular처럼 괄호 없이 꺼내 콜백으로 넘기면, 나중에 호출될 때 점 앞의 객체가 없어 this가 learner를 가리키지 않습니다. 이럴 때는 learner.regular.bind(learner)로 this를 고정한 새 함수를 만들거나, () => learner.regular()처럼 감싸서 넘깁니다.
this가 선언된 위치만 보고 값을 판단하지 말고 함수가 어떻게 호출됐는지 확인하세요.
직접 바꿔보세요regular 메서드를 다른 객체에 복사해 호출하고 결과를 확인하세요.