티스토리 뷰
this의 필요성
객체는 상태를 나타내는 프로퍼티와 동작을 나타내는 메서드를 하나의 논리적인 단위로 묶은 복합적인 자료구조다.
동작을 나타내는 메서드는 자신이 속한 객체의 상태, 즉 프로퍼티를 참조하고 변경할 수 있어야 한다. 이때 메서드가
자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다.
function Circle(radius){
// 이 시점에는 생성자 함수 자신이 생성할 인스턴스를 가리키는 식별자를 알 수 없다.
????.radius = radius;
}
Circle.prototype.getDiameter = function(){
// 이 시점에는 생성자 함수 자신이 생성할 인스턴스를 가리키는 식별자를 알 수 없다.
return 2 * ????.radius;
};
// 생성자 함수로 인스턴스를 생성하려면 먼저 생성자 함수를 정의해야 한다.
const circle = new Circle(5);
자기 자신이 속한 객체를 재귀적으로 참조하는 방식은 일반적이지 않으며 바람직하지 않다.
생성자 함수를 정의하는 시점에는 아직 인스턴스를 생성하기 이전이므로 생성자 함수가 생성할 인스턴스를 가리키는 식별자를 알 수 없다.
인스턴스 : 생성자 함수가 생성한 객체
this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수(self-referencing variable)다.
this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.
this가 가리키는 값, 즉 this 바인딩은 함수 호출 방식에 의해 동적으로 결정된다.
바인딩 : 식별자와 값을 연결하는 과정
this바인딩 : this와 this가 가리킬 객체를 연결하는 과정.
함수호출방식의 종류에 따른 this값
1. 일반 함수 호출 - window
2. 메서드 호출 - this를 호출한 객체
3. 생성자 함수 호출 - 생성자 함수가 생성한 인스턴스
4. Function.prototype.apply/call/bind 메서드에 의한 간접 호출 - 첫번째 인수로 전달한 객체
5. 화살표 함수 호출 - 상위 스코프의 this를 가리킨다
2번 메서드 호출 안에서 일반 함수를 호출했을 때 일반 함수 안에서의 this는 무엇을 가리킬까?
정답 : window, 일반 함수로 호출된 모든 함수(중첩 함수, 콜백 함수 포함) 내부의 this에는 전역 객체가 바인딩된다.
var value = 1;
const obj = {
value : 100,
foo() {
console.log("foo's this : ", this); // {value: 100, foo: f} f는 함수를 의미
// 콜백 함수 내부의 this에는 전역 객체가 바인딩된다.
setTimeout(function(){
console.log("callback's this: ", this); // window
console.log("callback's this.value : " , this.value); // 1
}, 100);
}
};
obj.foo();
setTimeout 콜백 함수 안에서 this를 window객체가 아닌 foo()메서드의 this객체를 가리키게 하려면 어떻게 해야할까?
1. foo() 메서드에서 this를 변수에 할당해서 콜백함수 내부에서 변수를 참조한다.
var value = 1;
const obj = {
value : 100,
foo() {
// this 바인딩(obj)을 변수 that에 할당한다.
const that = this;
setTimeout(function(){
// 콜백함수 내부에서 this 대신 that을 참조한다.
console.log(that.value); // 100
}, 100);
}
};
obj.foo();
2. 콜백함수에 명시적으로 this를 바인딩한다.
var value = 1;
const obj = {
value : 100,
foo() {
// 콜백 함수에 명시적으로 this를 바인딩한다.
setTimeout(function(){
console.log(that.value); // 100
}.bind(this), 100);
}
};
obj.foo();
3. 화살표 함수를 사용한다.
var value = 1;
const obj = {
value : 100,
foo() {
// 화살표 함수 내부의 this는 상위 스코프의 this를 가리킨다.
setTimeout(() => console.log(that.value), 100); // 100
}
};
obj.foo();
'개발공부 > Javascript' 카테고리의 다른 글
#기본기5_비교연산자 (==와 ===, null과 undefined) (0) | 2024.04.02 |
---|---|
#기본기4_문자열과 숫자의 결합 (0) | 2024.04.02 |
#기본기3_var, let, const의 차이 (0) | 2024.04.02 |
#기본기2_"use strict" (0) | 2024.04.02 |
#기본기1_자바스크립트의 문자열 변환 (1) | 2024.04.02 |
- Total
- Today
- Yesterday
- cors위치
- .finally()
- 조대곤교수님
- 상속
- null과 undefined
- 함수
- universal rendering
- 배열내특정요소찾기
- 비동기
- 프로토타입 체이닝
- Props
- 리액트 이미지경로
- JSX
- 머리아프다..
- 함수형코딩
- unique "key" prop.
- .then()
- 에이블스쿨2일차
- 객체리터럴
- 태스크큐
- 전역변수
- 동등비교연산자
- 미들웨어위치
- 대괄호표기법
- promise
- 문자열
- react
- .catch()
- 객체속성 추가 삭제
- unexpected character
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |