Frontend 개발자 - hyo.loui
자바스크립트 - this 본문
❤️🔥TIL : Today I Learned
명시적 this 바인딩
- 상황에 따라 달라지는 this
- 메서드 내부 함수에서 this 우회
- 명시적 this 바인딩
- 상황에 따라 달라지는 this
this는 실행 컨텍스트가 생성될 때 결정(this binding) === this는 함수를 호출할 때 결정하며
전역 공간에서 this === window
// 전역 공간에서의 this
console.log(this);
console.log(window);
console.log(this === window); //true
- 함수 호출시 this === window
ex) function();
// 함수와 메서드 호출시 각각 this 는 각각 다르게 할당
var func = function (x) {
console.log(this, x);
};
func(1); // Window { ... } 1
var obj = {
method: func,
};
obj.method(2); // { method: f } 2
- 메서드 호출시 this === 자신을 호출한 대상 객체(아래에서는 variable 에 해당한다
ex) variable.function()
※ 메서드 호출의 구분은 메서드 앞에 [ ] 또는 .
var obj = {
methodA: function () { console.log(this) },
inner: {
methodB: function() { console.log(this) },
}
};
obj.methodA(); // this === obj
obj['methodA'](); // this === obj
obj.inner.methodB(); // this === obj.inner
obj.inner['methodB'](); // this === obj.inner
obj['inner'].methodB(); // this === obj.inner
obj['inner']['methodB'](); // this === obj.inner
- 메서드 내부함수에서의 this
메서드 내부에서라도 함수를 호출한다면 해당 함수의 this === window
var obj1 = {
outer: function() {
console.log(this);
var innerFunc = function() {
console.log(this);
}
innerFunc(); // this === window
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod(); // this === obj2
}
};
obj1.outer(); // this === obj1
- 메서드 내부 함수에서 this 우회
위 처럼 내부함수에서 this를 할당해야 한다면 다음과 같은 방법이 있다.
- 변수 선언
함수 내부에서 변수에 this 를 지정하여 넣는 방법이다
- 변수 선언
var obj1 = {
outer: function() {
console.log(this);
var innerFunc1 = function() {
console.log(this);
}
innerFunc1();
var self = this;
var innerFunc2 = function() {
console.log(self);
};
innerFunc2();
}
};
obj1.outer();
- 2. 화살표 함수 : arrow function
ES6 신문법 으로 화살표 함수는 this binding 을 생략한다!
var obj = {
outer: function() {
console.log(this);
var innerFunc = () => {
console.log(this);
};
innerFunc(); // this === outer
}
}
obj.outer(); // this === outer
3. 생성자 함수 내부에서의 this
생성자 함수에서 this 는 해당 인스턴스 이다
var Cat = function (name, age) {
this.bark = '야옹';
this.name = name;
this.age = age;
};
var choco = new Cat('초코', 7); //this : choco
var nabi = new Cat('나비', 5); //this : nabi
- 명시적 this 바인딩
- call 메서드 : 호출 주체인 함수를 즉시실행
call 메서드에서는 모든 함수에서 사용 가능, this 를 특정값으로 지정 - apply 메서드 : call 과 매개변수 처리방법만 다르고 동일한 기능을 한다.
배열을 받아 배열을 반환 한다 ex) ...[array] 비구조화 할당 - 유사 배열 객체 : 객체지만 배열처럼 동작 가능. 하지만 반드시 length 가 필요하다
- slice 메서드로 전체 '유사배열 객체' 를 배열로 반환
- argument : 함수 내부에서 활용할 수 있는 변수
- call 메서드 : 호출 주체인 함수를 즉시실행
최종 정리
- 전역공간 this === window
- 함수호출 시 this === window
- 메서드 호출 시 this === 자신을 호출한 대상 객체, 메서드 호출은 [ ] 또는 . 이 앞에 있어야 한다
- 메서드 내부함수에서 this 우회 방법 = 함수내부에 변수 만들어 this 할당, ★arrowFunction
- call 메서드 : 모든함수에서 사용 가능, this를 특정값으로 지정
- apply 메서드 : call 과 동일한 기능이지만, 배열을 받아 배열을 반환
- bind 메서드 : 함수의 this 값을 영구히 바꿀 수 있다.
'Javascript' 카테고리의 다른 글
자바스크립트 - 자주 쓰이는 배열 메서드[forEach, map, filter, reduce] (2) | 2022.12.06 |
---|---|
Yarn VS NPM (2) | 2022.12.05 |
자바스크립트 - 실행 컨텍스트(VE, LE, 호이스팅, 스코프) 개념 정리 (2) | 2022.12.01 |
자바스크립트 - 데이터 타입 (얕은 복사, 깊은 복사) (2) | 2022.11.30 |
fanpick 프로젝트 셀프 코드 리뷰 - CRUD(in R) (1) | 2022.11.29 |