inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

전진! 3D 스크롤 23

제가 질문이 너무 많네요ㅠ self에 대해서 질문 할게요

165

신준석

작성한 질문수 10

2

제가 지금 한 여섯번 정도 들어봐도 이해가 잘 안가서요...
this를 여기서 self로 바꿔준 이유가 window를 객체로 삼았기 때문에 협소하게 만들어서 init안에서 활동하도록 self로 지정해준 거잖아요?

그래서 

const self = this;

로 지정하고 init안에서는 this대신에 init으로 썼다는 건 이해가 가는데, 갑자기 run에서는 이것조차 지워버리고 객체 안에 self를 넣는 순간부터 설명이 좀 이해가 안가서요ㅠ 잘 따라가다가 마지막에

run: function(self) {
if(self.direction == 'left') {
self.xPos -= self.speed;
} else if(self.direction == 'right') {
self.xPos += self.speed;
}
//실제로 움직이게 만들어주려면 left값을 계속 갱신해줘야 하니까 이걸 넣는다.
self.mainElem.style.left = self.xPos + '%';

// 반복시켜줘야하니까 쓰는 것 method를 호출. (context가 바뀐 것)
requestAnimationFrame(function() {
self.run(self);
})
}

왜 self가 들어가야하는건지, 위에 keydown event에서는 왜 또 self를 넣어야 이게 작동되는건지.. 혹시 ㅜㅜ 좀 더 깔끔한 설명 가능할까요? 아니면 앞 강의 중 어떤 걸 들어야 이게 좀 더 명확하게 다가올까요. 사실 this를 이해하는 것도 좀 오래걸리긴했는데 여기서 완전 멘붕이 오네요ㅠ 

javascript 인터랙티브-웹 HTML/CSS

답변 1

0

1분코딩

requestAnimationFrame 안에서 호출하기때문에 특수한 상황이 발생한건데요,
requestAnimationFrame에 인자로 넘어간 함수 안에서는 this 자체가 전역객체(window)가 되기 때문에,
run 함수에서의 this는 더이상 character 객체로 사용할 수 없기 때문에 const self = this;는 필요가 없어져서 삭제를 한거랍니다.
this를 사용할 상황은 못되고, this를 대신해서 character 객체를 가리키고 있는 변수가 필요한 상황인데
keydown 이벤트 핸들러 내부의 self가 있으므로 그걸 그대로 run 에서도 사용하기 위해 run 메서드 안에서 self를 명시적으로 이용할 수 있도록 self.run(self) 이렇게 직접 넣어서 호출해준 것입니다.
사실 이게 쉽게 이해될 수 있는 개념은 아니라고 생각되서.. 이해하기가 쉽지 않으셨을거에요^^;
"우리의 의도와 다르게 바뀌어버린 this 대신 다른 변수(self)를 사용해야 하는데, 그 변수를 활용하기 위해 다른 메서드의 self를 가져와서 쓴다- 그러기 위해 self를 사용할 메서드의 인자로 self를 넣어준다."
이렇게 정리할 수 있겠습니다.

왼쪽/오른쪽 동작시 딜레이 문제

0

93

1

변수 범위 관련 질문

0

106

1

perspective 문의

0

100

1

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

0

150

1

스크롤이 중간 위치에 있을 때 창의 크기를 변환하면 생기는 문제

0

127

1

animation이벤트 질문이요!

0

71

1

resize handler에서 질문이 있습니다.

0

110

1

카드 뒤집힐 때 F가 보인 이유

0

149

1

3d 뒤집기 추가효과

0

218

1

전진! 3D 스크롤 21 강의 질문

1

171

1

eventlistener 질문

0

149

1

zMove 를 1000으로 설정하는 이유에 대하여.

0

168

1

[정보-23강] ES6 class 문법으로 공부하시는 분들!! 화살표 함수로도 시도해보셔요!

1

191

1

동적으로 html 생성 후 이벤트 위임 질문 있습니다.

0

266

1

rotateY()에서 deg에 따른 차이

0

197

1

코드 작성 순서

0

276

1

이미지가 없는데 첨부파일을 다운 받는 방법이 있나요??

1

394

1

'이벤트 위임 보강 영상'에 있는 예제 html이 안 보입니다

0

265

2

섹션5 자바스크립트 이벤트 다루기 질문

1

243

1

[#전진! 3D 스크롤 11] mousePos 공식 질문 있습니다!

0

423

2

css 는 직접 작성을 해야하는걸까용?

0

326

1

translateZ 에 px 이 아닌 vw 로 값을 주신 이유가 있을가요?

0

360

2

house 부분에도 width , height 부분을 꽉 차게 주신 부분이 제가 이해한게 맞는지 궁금합니다.

0

305

2

left:-400vw 가 아닌 translateZ(100vw); 을 입력하신 이유가 궁금합니다.

0

306

2