다음 문서와 상호 보완하여 공부하도록 하자:this

ThisBinding이 있던 것을 기억하는가? 실행 컨텍스트가 활성화될때 ThisBinding이 이루어진다는 것을 기억하는 것이 핵심이라고 한다.
this를 바인딩한다. 그런데 이 실행 컨텍스트는 언제 생성된다 했지? 바로 이 컨텍스트에 해당하는 함수가 호출되는 순간이다. 즉 this도 실행컨텍스트와 마찬가지로 함수가 호출될때 비로소 결정되는 것이다.this라는 것은 정적으로 코드만 봤을때 얘의 this는 무엇이다~ 라고 바로 예측할 수 있는 것이 아니라, 이 함수를 어떤 식으로 호출했느냐에 따라서 얼마든지 달라질 수 있는 것(동적으로 바인딩 된다)이다” … 라고 한다.this가 함수가 호출될 때 결정된다 ⇒ 즉 this는 함수가 호출되는 방식에 따라 다르다!
this가 어떻게 달라지는가? 는 다음 다섯가지로 나누어서 구분할 수 있다. 그걸 하나씩 살펴보자.
this앞에 이미 설명했듯이, 전역 공간 컨텍스트는 코드가 실행되면 처음에 무조건 자동으로 생성된다. 따라서 이때의 this는 항상 같은 값으로 딱 정해져 있다.
전역 공간에서의 this는 전역 객체를 가리킨다. 전역 객체란? 이건 그냥 딱 암기하면 된다.
브라우저에서는 window,
node.js에서는 global
… 이라는 객체가 바로 전역 공간에서의 this가 가리키는 값이다.
굳이 원리를 따지자면 전역 객체의 정의가 “전역 컨텍스트를 실행하는 주체” 이기 때문에 그렇게 된다. 즉 브라우저에서는 window, node.js에서는 global이라는 객체가 전역 컨텍스트를 실행하는 주체이기 때문에 전역 객체인 것이다.
window.function1() 와 같이 마치 윈도우 객체의 메소드처럼 호출하는 것이 가능하다. 그리고 console.log(window)를 해보면 내부에 내가 정의한 함수를 가지고 있는 것을 확인할 수 있다.따라서 JS가 실행되는 환경, 즉 런타임에 따라 전역 객체의 정보가 달라진다.
console.log(this); 하면 window 객체가, node.js에서는 global 객체 내용이 찍힌다.window와 global은 ECMAScript에서 직접 정의한 객체가 아니고, ECMAScript가 ‘전역 객체는 이러이러해야 한다’라고 정의해둔 내용(일종의 가이드 같은 느낌?)을 따라서 런타임에서, 즉 각 호스트 환경(브라우저와 노드)에 따라서 알아서 제공하는 구현체라고 한다. 그래서 전역 객체를 host 객체라고도 하는 것이다.
반전으로 함수 호출 시에도 this는 전역 객체를 가리킨다고 한다. 즉 window 아니면 global을 가리킨다.
왜냐하면 일반 함수 호출의 주체는 사실 전역객체이기 때문이다. 우리가 일반적으로 함수를 호출할때는 사실 앞에 전역객체가 생략되어 있다고 볼 수 있다. 예를들어 함수 a(); 를 이렇게 호출한다고 했을때, 사실은 window.a();를 한 것과 같다. 그리고 실제로 브라우저 콘솔에서 이렇게 입력해도 실행이 된다.

a(); 같은 경우는 뭐 가장 바깥쪽에 있으니까 전역 객체가 호출했다고 치자. 그러면 c()의 경우는 어떨까? b() 안에 있으니 호출의 주체가 b인가?
c 내부의 this도 c가 b안에서 호출되었더라도 여전히 전역 객체를 가리킨다.⇒ 이러한 JS의 작동 방식을 오류라고 말하는 사람도 있고, JS의 고유 특성이라고 보는 시각도 있다고 한다. 어쨌든 ES5까지는 이렇게 작동하기 때문에, 알아두어야 한다.
즉 ES5까지는 일반적으로 그냥 함수를 호출할때 함수 내부의 this는 전부 무조건 전역 객체를 가리킨다는 사실을 알아두자.
그럼 이런 경우는 어떨까? method 함수인 e 내부에서 호출된 f 는??

f(); 이러케 호출되었기 때문에 묻지도 따지지도 않고 f 내부의 this는 전역 객체를 가리킨다고 한다. (결국 window.f(); 를 한 것과 같다는것)
e내부의 this 바인딩에 대해서는 다음 단원? 에서 알랴줌.ES6 - Arrow function
this 바인딩을 하지 않는 arrow function이란게 나왔다고 한다. (arrow function에 이런 중요한 차이가 있었군?)
this를 그대로 가져다 쓴다고 한다.this
실제 출력 결과. 자막에도 나와 있듯이, b메소드 내부에서 this를 출력한 결과를 보면 a 객체와 똑같이 생긴 것(b메소드를 가지고 있는 객체의 모습)을 확인할 수 있다.
b가 객체의 메소드 함수로서 정의되어 있을때, a.b()와 같이 쩜(.) 다음에 호출되는 상황을 method로서 호출되었다고 한다.this는 호출한 대상 객체에 바인딩 된다고 한다.
b내부의 this는 a라는 객체를 가리키게 된다.