inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

화살표 함수

이벤트 리스너에서의 this에 대해 여쭙고 싶습니다

해결된 질문

533

Like me black

작성한 질문수 65

0

강사님 안녕하세요

1. 7분에서
button.addEventListener('click', function(){

concole.log(this.textContext);

});

에서의 this에 대해 질문드리고 싶습니다

이때 this가 햇갈린 이유는 다음과 같습니다

2. 지난번에 드렸던 질문의 소스코드에서

var relationship1 = {
    name:'zero',
    friends : ['nero', 'hero', 'xero'],
    logFriends: function(){
        var that = this;
         console.log(`this: ${this}, that: ${that}`);
        this.friends.forEach(function(friend){
            console.log(that.name,friend);
            console.log(`this: ${this}, that: ${that}`);
        });
    }
}
relationship1.logFriends();
 
 
여기서 forEach 함수 내에 있는 콜백함수
funtion( ) 의 this는
호출되는 시점에
객체.function(friend){
            console.log(that.name,friend);
            console.log(`this: ${this}, that: ${that}`);
      }
 
형식이 아닌
foreach( ) 호출 후에
 
콜백함수인 function( )이 단일로 호출이 되었기에
 
this가 window 라는 것을 이해했습니다
 
 
 
 
강의 7분 이벤트리스너에서의 this의 예시에서도

button.addEventListener('click', function(){

concole.log(this.textContext);

});

에서

button.function() 형식이 아닌

button.addEventListener( )가 호출된 다음

콜백함수로 function( ) 자체로만 호출이 되는건데

function( ) 안의 this가 window 가 아닌, button 을 가리키는 이유가 이해가 어려워서 질문드리고 싶습니다

 

nodejs mysql mongodb Sequelize

답변 1

1

제로초(조현영)

해당 함수 선언이 콜백 함수 역할이라는 데 주목하셔야 합니다.

forEach의 function의 this나 addEventListener의 function의 this는 각각 forEach나 addEventListener에 의해 조작될 수 있습니다.

button.addEventListener는 콜백 함수 function의 this를 조작한 겁니다. 아래 코드와 같이요.

button = {
  addEventListener(eventName, cb) {
    cb.call(this);
  }
}

button.addEventListener의 this는 button인데 call로 콜백함수 cb의 this를 button으로 바꿀 수 있습니다.

forEach는 콜백함수의 this를 조작하지 않은 겁니다.

0

Like me black

강사님 답변해주셔서 감사합니다

아직 이해가 어려운 부분이 있어서 더 질문드리고 싶습니다

질문1.
라이브러리에 선언된
button 객체의 원형이
button = {
  addEventListener(eventName, cb) {
    cb.call(this);
  }
}

라는 말씀으로 이해해도 될까요?


질문2. 
제가 봤을 때는
소스코드가 실행이 될 때
콜백 함수 function( ) 호출 시점에서
function( )단일로 호출되므로 
아무리 생각해도, 안의 this가 window 같습니다

조작을 했다는 말씀이
소스코드가
실행이 될 때 V8 엔진이

이벤트리스너 소스코드

button.addEventListener('click', function(){ });


실행 도중에 
button = {
  addEventListener(eventName, cb) {
    cb.call(this);
  }
}
button.addEventListener.cb.call(this);

이런 식으로 중간에 조작해서 실행했다는 말씀이신가요?


질문3.
현재 제 수준에서는 이해가 어려워서 혹시 call 함수를 공부하면 이해하는 데 도움이 되는지도 질문드리고 싶습니다


0

제로초(조현영)

1. 그냥 예시를 든 것입니다. C++로 작성되어있을거라서 구체적인 코드는 모릅니다.

2. 단순히 호출 시에 function에 다른 this를 바인딩한 것입니다.

function은 기본적으로 this가 window라고 했죠? 그리고 이 this는 정확하게는 호출 시에 정해집니다. function의 이름이 a라고 했을 때 a();를 하면 this가 window가 되는 것이고, button.a()를 하면 this가 button이 되는겁니다. addEventListener에 넣은 function은 호출 시에 내부적으로 function.call(태그)를 해서 this를 태그로 바꾸는 것이고요.

0

Like me black

강사님 너무 많은 질문을 받아주셔서 감사합니다

그러면 이 조작이라는 것을 이렇게 이해해도 되는지 질문드리고 싶습니다
1.
V8 엔진이 소스코드를 실행 중에
2.
이벤트 리스너 함수를 만나면
3.
이벤트 리스너 함수를
엔진 내부에 C++ 로 미리 정의되어 있는 소스코드로 조작을 해주기 때문에
4. 
이벤트 리스너 함수의 콜백함수 this는
실행 도중에 window에서
이벤트 객체 button으로 변한다는 말씀으로
이해해도 되는지 질문드리고 싶습니다


0

제로초(조현영)

window에서 변한다기보다는 그냥 this가 바로 button이 되는 겁니다. 호출할 때 this를 정하는 것이고, 아무 조작이 없으면 window가 되고, 조작이 있으면 그걸로 변하는 겁니다.

0

Like me black

강사님 혹시 이렇게 이해해도 되나요?

만약에 소스코드가 1행부터 5행까지 있으면

소스코드가 첫줄부터 차례대로 실행되는데
예를 들면 중간에 3번째 줄의 함수가 라이브러리에서 구현되어 있는 함수면

그 라이브러리로 건너뛰어서 해당 함수를 구현한 코드를 수행하고

전부 마치면 다시 원래대로 3행으로 돌아오고 다시 순서대로 실행하듯이


제 눈에는 이벤트리스너를 조작한 코드가 보이지 않지만

자바스크립트 기본 내장된 라이브러리에서

이벤트 리스너 함수를 조작한 C++ 코드가 있어서

이벤트 리스너 함수를 실행하는 차례에

그 이벤트 리스너 함수를 조작한 라이브러리의 코드가 실행이 되어서

제 눈에는 조작된 코드가 안보이지만, 자동으로 조작이 되는 원리인가요?

0

제로초(조현영)

네 이벤트가 발생할 때 c++에서 이벤트리스너에 등록된 콜백에 this를 바꿔서 실행해주는 겁니다.

0

Like me black

강사님 너무 많은 질문을 받아주시고 가르쳐주셔서 감사합니다

리눅스 노드 설치시 패키지

0

172

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

932

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2297

2

a[title] 질문드립니다

0

388

1

리뉴얼 강의 및 공부 방법

0

591

1

jwt decode

0

1139

1

node.js 교과서 3판 질문드립니다

0

399

1

passport와 jwt

0

439

1

리뉴얼 강의

0

428

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

360

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

491

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

512

2

nunjucks res.render('error'); 작동을 안합니다.

0

521

1

질문있습니다.

0

349

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3547

1

수업자료는 어디있나요?

0

374

1

질문 있습니디

0

245

1

multer 사용시 file 외 name값은 못받나용?

0

431

1

코드 중복 부분 질문드립니다.

0

303

1

api 만드는 이유 질문드립니다.

0

294

1

Strategy의 done에 대해 질문드립니다.

0

375

1

안녕하세요 fs 권한 관련 질문드립니다

0

457

1

시퀄라이즈 연결질문...

0

511

2

res.setHeader vs res.cookie

0

1799

3