인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

samkookji12님의 프로필 이미지

작성한 질문수

인터랙티브 웹 개발 제대로 시작하기

전진! 3D 스크롤 21

생성자 함수를 클래스 함수로 변경 하고 this 오류 관련

작성

·

46

0

init() {
        window.addEventListener('scroll', () => {
            this.scrollRunHandler();
            this.scrollPosition(this.mainElem);
        });
    }
    scrollRunHandler() {
        clearTimeout(this.scrollState);
        if (!this.scrollState) {
            this.mainElem.classList.add('running');
        }

        this.scrollState = setTimeout(() => {
            this.scrollState = false;
            this.mainElem.classList.remove('running');
        }, 500);
    }
    scrollPosition = (elem) => {
        if (elem.lastScrollTop > window.scrollY) { // 스크롤을 아래로
            this.mainElem.dataset.direction = 'backward';
        } else { // 스크롤 위로
            this.mainElem.dataset.direction = 'forward';
        }
        elem.lastScrollTop = window.scrollY;
    }

생성자 함수를 클래스 함수로 변경하면서 this가 character를 가리켜야 되는데 window를 가리키는 문제가 생겨서 변수를 그냥 넣어줘서 작동은 하는데 이렇게 하는게 맞는지 궁금합니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. samkookji12님.

클래스에서 this는 항상 클래스의 인스턴스를 가리키도록 설정되어야 합니다. 화살표 함수(=>)를 사용하면 this는 함수가 정의된 곳의 상위 스코프에서 값을 가져오기 때문에, window가 아닌 현재 클래스의 인스턴스를 가리킵니다. 보내주신 코드에서는 이미 init() 함수 내의 이벤트 리스너와 scrollState 변수 초기화에 화살표 함수를 사용하고 있기에, this가 문제없이 클래스의 인스턴스를 가리켜야 합니다.

이 문제를 해결하기 위해 다음을 확인할 수 있습니다:

  1. init() 함수 내에 사용된 이벤트 리스너 코드가 화살표 함수로 선언되어 있어 this는 클래스의 인스턴스를 참조합니다.

  2. scrollPosition 함수에서는 함수 표현식이 잘못 인식될 가능성이 없습니다. 화살표 함수로 선언되어 this가 올바르게 바인딩되고 있습니다.

해당 코드 내에서 this 바인딩 문제를 해결하기 위한 올바른 접근 방법을 사용하고 있습니다.

관련한 비슷한 질문과 답변을 찾아보면 도움이 될 수 있습니다:

또 다른 도움이 필요하시다면 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.