#1. this?
- this는 자기 참조 변수
- this는 호출한 방법에 의해 결정된다.
- 대부분의 경우 this는 호출한 놈!
* 예외
- 전역 스코프에서 this는 window객체
- 화살표 함수에서 this는 상위 스코프의 this
- strict mode에서 this의 기본값은 undifined (window아님)
case1. 대부분의 경우 this는 자신을 호출한 놈
- 대부분의 경우 this 는 자신을 호출한 놈이다.
var person = {
name : "사람",
getThis : function(){
console.log(this);
}
}
// case01. this는 자신을 호출한 person
person.getThis(); // {name: '사람', getThis: ƒ}
case2. 따로 지정해둔게 없다면 기본적으로 this 는 전역 객체
- 호출한 놈이 따로 없을때, this는 기본적으로 전역객체(window)를 갖는다
function fn(){
console.log(this);
}
fn(); // window
var person = {
name : "사람",
getThis : function(){
console.log(this);
}
}
// case01. this는 자신을 호출한 person
person.getThis(); // {name: '사람', getThis: ƒ}
// case02. this를 호출한 객체가 따로 없으므로, this는 전역객체 window
var getThis2 = person.getThis;
getThis2(); // Window
case3. 콜백함수에서 this는 주의해야함.
- this를 부르는 btn이 this임
See the Pen 콜백함수에서 this by jang (@todak) on CodePen.
- person.fn 형태로 호출을 해도, 안의 setTimeout 은 호출하는 놈이 없으니, this는 전역객체 window로 출력
let person = {
name: '김윤아',
fn: function(){
setTimeout(function(){
console.log(this);
}, 1000)
}
}
person.fn(); // window
case4. this를 임의로 넣고 싶다면, bind()메소드를 쓴다.
function getThis() {
console.log(this);
}
let person1 = {
name: '홍길동'
}
getThis(); // window
// this의 값을 정해주기 위해서는 bind메소드를 사용한다
let getThis2 = getThis.bind(person1);
getThis2(); // {name: '홍길동'}
- 바인드는 한번만 사용 가능하다.
- bind된 함수에 bind를 한번 더 해봤자 처음에 bind 된 값만 나온다
function getThis() {
console.log(this);
}
let person1 = {
name: '홍길동'
}
let person2 = {
name: '김나영'
}
// this의 값을 정해주기 위해서는 bind메소드를 사용한다
let getThis2 = getThis.bind(person1);
getThis2(); // {name: '홍길동'}
// bind는 한번만 쓸 수 있다. bind된 함수에 bind를 한번 더 해봤자 처음에 bind 된 값만 나온다
let getThis3 = getThis2.bind(person2);
getThis3(); // {name: '홍길동'}
- 앞의 setTimeout 콜백함수도, this를 bind해주면, 자신을 감싼 함수를 this로 받아올 수 있다.
let person = {
name: '김윤아',
fn: function(){
console.log(this); // {name: '김윤아', fn: ƒ}
setTimeout(function(){
console.log(this);
}.bind(this), 1000)
}
}
person.fn(); // {name: '김윤아', fn: ƒ}
case5. 화살표 함수에서 this 는 상위 스코프의 this
- 화살표 함수 안에서 this는 언제나 상위 스코프의 this
- 화살표 함수는 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정됨
let person = {
name: '김윤아',
fn: function(){
console.log(this); // {name: '김윤아', fn: ƒ}
setTimeout(() => {
console.log(this);
}, 1000)
}
}
person.fn(); // {name: '김윤아', fn: ƒ}
case6. Strict Mode
- Strict Mode 에서 호출한 놈이 없을땐, 기본값이 undifined
'use strict' // strict mode 선언
function fn(){
console.log(this);
}
fn(); // undefined
* 참고 자료
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
이웅모. 『모던 자바스크립트 Deep Dive』. 위키북스, 2020
https://www.youtube.com/watch?v=GteV4zfqPIk
'Study > JavaScript' 카테고리의 다른 글
[JavaScript] ... Spread Operator = 괄호 벗겨주세요 (0) | 2023.06.20 |
---|---|
[JavaScript] 문자조작에 유용한 tagged literals (0) | 2023.06.19 |
[JavaScript] 호이스팅이란? (0) | 2023.04.28 |
[javascript 메서드 정리] 스크롤 이동 메서드 window.scroll() VS window.scrollTo() VS window.scrollBy() (0) | 2023.03.15 |
parseInt()와 Number() 차이점 (0) | 2022.08.04 |