1. 일반 함수에서 호출하는 this
2. 메소드에서 호출하는 this
3. 생성자 함수에서의 this
4. 콜백 함수에서의 this
5. 화살표 함수에서의 this
우선 간단히 중요한점을 요약 하자면
전역에서 사용한 this
- 전역 객체에서 사용한 this는 항상 window이다.
- 전역 객체란 전역 범위에 항상 존재하는 객체를 의미한다.
- 자바스크립트 런타임에서 모든 변수 및 함수는 window라는 전역 객체의 프로퍼티와 메소드이다.
함수 내부에서 사용한 this
- 함수는 전역에 선언된 일반 함수와 객체 안에 메소드로 크게 구분할 수 있다.
- function 키워드로 선언된 함수는 일반 함수이다.
- 객체안에 선언된 함수는 전역에 선언된 함수와 비교하기 위해 메소드라고 한다.
- 전역에 선언된 함수와 function 키워드로 선언된 함수는 일반 함수이며, 결국 window(전역) 객체의 메소드이다.
- 일반적인 경우 함수와 메소드에서 호출하는 this의 값은 함수를 호출하는 방법에 의해 달라진다.
- 엄격 모드에서 일반 함수 내부에 있는 this는 undefinded가 바인딩 된다.
- 콜백함수에서의 this는 콜백함수가 일반 함수이면 window를 바라본다. 화살표 함수이면 상의 스코프의 this를 가리킨다.
- call, apply, bind 메소드를 통해 this값을 바인딩 시킬 수 있다.
- function 키워드로 생성한 일반함수와 화살표 함수의 큰 차이점은 this이다.
- 화살표 함수 안에있는 this는 항상 상위 스코프의 this를 가리킨다.
- 화살표 함수는 call, apply, bind 메소드를 사용하여 this를 변경할 수 없다.
1. 일반 함수에서 호출하는 this
위에서 적어논듯이 일반적인 경우 this의 값은 호출하는 방법에 의해 달라진다고 하였다. sik()함수를 window 전역 객체에서 호출하였기 때문에 this의 값은 window이다.
function sik () {
return this;
}
sik(); // window 객체 출력 window.sik()으로 호출한것과 같다.
console.log(sik() === window.sik()) // true
2. 메소드에서 호출하는 this
이 경우도 this의 값은 호출하는 방법에 의해 달라지기 때문에 sik객체이다. showContent() 함수를 sik객체를 통해 호출하였기 때문에 this의 값은 window이다.
const sik = {
content: 'Hello World!',
showContent() {
console.log(this.title);
}
};
sik.showContent(); // 'Hello World!'
3. 생성자 함수에서의 this
new 연산자를 사용하여 생성자 함수 방식으로 인스턴스를 생성한 경우에는 window 객체에서 사용하더라도 생성된 객체를 바라본다.
function Sik() {
this.content = 'Hello World!';
}
// new 연산자를 이용해서 새로운 객체를 얻는다.
const ms = new Sik();
ms // Sik {content: 'Hello World!'}
console.log(ms.content) // Hello World
4. 콜백 함수에서의 this
아래 콜백함수에서 호출하는 this의 값은 window이다. 왜냐하면 콜백함수는 일반함수이기 때문이다.
const sik = {
content: 'Hello World!',
numbers: [1, 2, 3, 4],
showNumber() {
this.numbers.forEach(function(number) {
console.log(number);
console.log(this); // window
});
}
}
sik.showNumber();
// 1
// window 객체 출력
// 2
// window 객체 출력
// 3
// window 객체 출력
// 4
// window 객체 출력
5. 화살표 함수에서의 this
function 키워드로 생성한 일반함수와 화살표 함수의 큰 차이점은 this이다. 화살표 함수 안에있는 this는 항상 상위 스코프의 this를 가리킨다. 일반 함수는 함수를 호추할 때 어떻게 호출되느냐에 따라 this가 달라지지만 화살표 함수는 함수를 선언할 때 this에 바인딩 할 객체가 결정된다. 또 중요한것은 화살표 함수는 call, apply, bind 메소드를 사용하여 this를 변경할 수 없다는 점이다.
const sik = {
content: 'Hello World!',
numbers: [1, 2, 3, 4],
showNumber() {
this.numbers.forEach((number) => {
console.log(number);
console.log(this); // sik
});
}
}
sik.showNumber();
// 1
// sik 객체 출력
// 2
// sik 객체 출력
// 3
// sik 객체 출력
// 4
// sik 객체 출력
'study > JavaScript' 카테고리의 다른 글
Js - 화살표 함수(Arrow Function) (0) | 2023.03.08 |
---|---|
Js - 자바스크립트 동작 원리(런타임 환경) (0) | 2023.02.20 |
Js - 불변성(immutability) React와 Vue의 불변성 차이 (0) | 2023.02.15 |
Js - 어휘적 환경(Lexical Environment)과 클로저(Closure) (0) | 2022.11.18 |
Js - 스코프(Scope) (0) | 2022.11.17 |