• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

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

22.03.06 21:14 작성 조회수 99

0

안녕하세요

강의 4분 21초부터 어려워서

(JavaScript) 자바스크립트의 this는 무엇인가? - ZeroCho Blog

(JavaScript) 함수의 메소드와 arguments - call, apply, bind - ZeroCho Blog

강사님의 블로그를 찾아서 공부했습니다

링크에서는 call apply bind 설명부터는 기본기가 부족해서 이해를 못했습니다

그러다가 궁금한 점이 생겨서 질문드립니다

질문1. function도 객체라고 볼 수 있는데

this는 function( ) 객체 안에 있어도 function 객체를 가리키지 않고 window를 가리킨다는 것을 공식으로 알아야 하나요?

예외적으로 객체 A안의 funtion안의 this의 경우는

function을 포함하는 A객체를 가리킨다고 생각해야 하나요?

 

질문2. 강의 4분 2초에서

funtion은 funtion마다 자기만의 this를 가진다는 말씀을 이해 못했습니다

C++이나 자바에서 생성자들이 자신만의 this를 갖는다는 맥락일까 싶기도 했고 아리송해서

직접 실험해보는 게 좋겠다 싶어서 68행에 

this와 that을 비교해봤습니다

아래는 소스코드입니다

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();

 

왜 여기서 68행의 this는 relationship1이 아닌, undefined가 나오는지 도저히 이해가 어려웠습니다

 

강사님께서 부모의 this 와 자식의 this 개념을 설명해주시긴 했지만, 제 기본기가 부족해서 이 코드에서 부모와 자식이 무엇인지 보이지가 않았습니다

 

자바나 C++에서 부모, 자식 클래스, 생성자, this, 오버라이딩 같은 개념을 공부하긴 했는데,

자바스크립트를 제대로 기본기를 다지지 않고, "모르는 개념이 나올 때마다 찾아서 공부하면 되겠지"라는 사고방식으로 하려니 한계에 부딪힌 느낌입니다

 

이럴 때는 강사님의 렛츠기릿 자바스크립트 강의를 처음부터 완주하는 게 나을지 질문드리고 싶습니다

[리뉴얼] 렛츠기릿 자바스크립트 - 인프런 | 학습 페이지 (inflearn.com)

 

답변 1

답변을 작성해보세요.

1

1. 함수 안에서는 전부 window입니다. obj.a의 this도 그 자체로는 window인데 obj.a() 하는 순간 this가 obj로 바뀝니다. 앞에 객체가 붙은것이 키포인트입니다.

2.68행의 this는 forEach 함수의 인수로 제공된 function의 this입니다. logFriends의 function이 부모고 forEach의 function이 자식함수입니다.

js의 this는 이해하고 나면 정말 쉬운 개념입니다. 다만 다른 언어 this의 지식은 잊어버리셔야 합니다. 그게 사람을 헷갈리게 만듭니다.

답변해주셔서 감사합니다
햇갈리는 부분이 아직 남아있어서 더 가르쳐주시면 감사하겠습니다

질문1. funtion( ) 함수 말고, foreach( ) 함수 같은 경우에는 this가 없는지 질문드리고 싶습니다


function( )함수 안에 foreach( ) 함수 안에 다른 function( ) 함수 가 있는 느낌이어서

 

그러면 함수 안에 함수 안에 함수가 있으니 this가 3개가 있는 건가요?

그러면 조부모, 부모, 자식 관계인가요?

질문 2. 강사님께서 다른 언어의 this 지식을 잊으라고 말씀해주셔서 그렇게 해보겠습니다

그런데 저는 지금까지, 부모와 자식 관계를 어떻게 알았냐면

언어에서 부모와 자식 간의 관계는 상속의 개념이 있다고 생각했습니다

혹시 이렇게 이해하면 될까요?

부모인  logFriends function( ) 객체의 멤버변수인 that을 자식인 foreach function( ) 객체가 물려받는 게 보이니

이 둘은 부모 자식 관계다 라고 이해했는데 제대로 이해한 게 맞는지 질문드리고 싶습니다

 

질문3. 저는 계속

logFriends 함수의 자식이 foreach 함수고 foreach 함수의 자식이 foreach 함수의 인수로 들어간 function( ) 으로 보입니다

계속 조부모 부모 자식 관계로 this가 3개가 있을 거라고 연상이 되는데

아예 자바스크립트 강좌를 다 돌려봐야 하는지 고민이 매우 되어서 질문드리고 싶습니다
만약에 강사님의 자바스크립트 강좌를 봐야 한다면
처음부터 몇강까지만 학습하면 충분할까요?

학기 중이라서 약간 시간이 촉박해서요

 

forEach 내부의 function도 this가 window입니다.

잘못생각하시면 안 되는게 forEach는 함수 선언이 아닙니다. 함수 호출이고요. forEach 내부에 넣은 function이 함수 선언입니다.

함수 선언 간에만 부모자식관계가 있고 스코프가 있는 겁니다.

logFriends 함수의 자식으로 바로 forEach에 넣은 function이 있는 겁니다.

2. 상속의 개념이랑 아예 관련이 없습니다. 스코프의 개념이고요. 이건 다른 언어도 거의 다 같습니다. 하위 스코프에서는 상위 스코프의 변수에 접근 가능하니, forEach의 function도 당연히 상위 스코프인 logFriends의 스코프인 that에 접근 가능한 겁니다.

3. 다시 한 번 말씀드리지만 함수 선언만 스코프와 관련이있고 부모자식 관계가 있는 겁니다. 선언!

방학 때 강사님의 자바스크립트 강의를 제대로 공부해보고 싶다는 생각도 드네요

상세하게 가르쳐주셔서 감사합니다 

함수 호출과 선언의 차이 기억하겠습니다