this
오늘은 자바스크립트에서 자주 헷갈리는 this 에 대해 알아보겠다.
this란?
자바스크립트에서는 함수 선언 시에 this 에 바인딩할 객체가 정적으로 결정되는 것이 아니고, 함수 호출 시 어떻게 호출되었는지에 따라 this 에 바인딩할 객체가 동적으로 결정된다. 즉, 함수 호출 전까지는 this 에 값이 할당되어있지 않는다.
그럼 이제 각각의 상황에서 this 에 어떤 값이 할당되는지 알아보자!
전역공간에서 this
- 브라우저에서
this:window - Node.js 에서
this:global
함수 내부에서 this
- 기본적으로 전역 객체를 가리킨다.
- defalut 값이 전역 객체, 바뀔 수 있음 (call, bind, apply)
내부함수에서의 우회법
1 | const obj = { |
아래와 같이 스코프체인을 이용하여 obj의 this에 접근이 가능하다.
1 | const obj = { |
화살표 함수에서 this
화살표 함수에는
this가 없다.화살표 함수 내부에서
this에 접근하면 외부에서 값을 가져온다.→ 일반 변수 서칭과 마찬가지로
this값을 외부 렉시컬 스코프에서 찾는다.
1 | const obj = { |
위의 예시를 보면, arrow 가 화살표 함수이기 때문에 this.a 는 화살표 함수 바깥의 메서드인 func 가 가리키는 대상과 같아진다. 즉, arrow 내부에서 obj.a === this.a
메소드 호출 시 this
- 메소드 호출 주체 (메소드명 앞)
- ex)
a.b()→this === a - ex)
a.b.c()→this === a.b
- ex)
callback에서 this
- 기본적으로는 함수 내부에서와 동일
- 제어권을 가진 함수가 callback의 this를 명시한 경우 그에 따른다.
call(),apply(),bind()사용하여 this를 설정할 수 있음func.call(thisArg[, arg1[, arg2[, ...]]])func.apply(thisArg, [argsArray])func.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg : func 를 실행할 때 인식하게 할 this 를 설정한다.call() 과 apply() 는 thisArg 자리에 this 로 인식할 객체를 넣고, 즉시 함수를 호출하는 점은 동일하다. 다른 점은 매개변수로 넘겨줄 인자들을 , 로 나열하느냐, 아니면 배열([]) 에 담아서 한번에 넘겨주느냐의 차이이다.bind() 는 call() 과 같은 방식으로 사용하지만 즉시 func 를 호출하는 것이 아니라 this 를 바인딩하여 새로운 함수를 생성한다.
1 | function func(x, y, z) { |
이벤트 핸들러에서 this
- 이벤트가 바인딩된 DOM 요소를 가리킨다.
- 즉, 이벤트 객체의
currentTarget속성을 가리킨다.
1 |
|
생성자 함수에서 this
- 인스턴스를 가리킨다.
1 | function Person(name, age) { |
요약
- 내부함수는 일반 함수, 메소드, 콜백함수 어디에서 선언되었든 관게없이 this는 전역객체를 바인딩한다.
call(),apply(),bind()를 사용하여 this를 설정할 수 있다.- 화살표 함수는 자신만의
this를 가지지 않는다. 화살표 함수 안에서this를 사용하면, 외부에서this값을 가져온다.
참조
https://ko.javascript.info/arrow-functions