JavaScript

[JavaScript] this 한 번에 정리

fnow 2022. 3. 8. 01:15
반응형

this는 생성자 혹은 메서드에서 객체를 가리킬 때 사용하는 키워드다. 각 상황에 따라 this가 어떤 객체를 참조하는지 정리해보자.

 

 

 

 

 

 

1. 기본 this

this는 기본적으로 window 객체를 참조한다.

 

console.log(this) // window

 

 

 

 

2. 객체에서 this

this는 myColor 객체를 참조한다.

 

const myColor = {
    color: "blue",
    checkColor: function() {
        console.log(this.color);
    }
};

myColor.checkColor(); // blue

 

 

 

 

3. 함수에서 this

전역 범위에서 호출된 함수의 this는 window 객체를 참조한다.

 

function checkThis () {
    console.log(this);
}

checkThis(); // Window

 

 

 

스트릭트 모드를 설정하면 window 객체 참조를 방지할 수 있다. 스트릭트 모드에서는 window  객체 대신 undefined로 설정된다. 전역 범위의 this 또한 undefined가 된다.

 

'use strict';

function checkThis () {
    console.log(this);
}

checkThis(); // undefined

console.log(this); // undefined

 

 

 

 

 

4. 객체 생성자 함수에서 this

함수에서 호출된 this는 window 객체를 가리키지만 객체 생성자 함수에서의 this는 생성자 함수가 생성하는 객체를 가리킨다.

 

function Person(name) {
    this.name = name;
    this.showName = function(){
        console.log(name);
    }
}

const person1 = new Person("홍길동");
person1.showName(); // 홍길동

 

 

 

 

 

5. Event handler에서 this

 

이벤트 핸들러에서 this는 이벤트가 발생한 요소를 가리킨다.

 

const box = document.querySelector('.box');

box.addEventListener("click", function() {
    console.log(this); // box
})

 

 

 

 

 

6. bind(), call(), apply()

bind(), call(), apply()를 사용하면 this의 참조 객체를 직접적으로 설정할 수 있다. 

 

bind()

 

const myColor = {
    color: 'blue'
};


function showColor() {
  console.log(this.color);
}

const binding = showColor.bind(myColor);

binding(); // blue

 

 

 

call()

 

function Person(name, age) {
    this.name = name;
    this.age = age;
}

function Female(name, age) {
    Person.call(this, name, age);
    this.gender = "female";
}

const female1 = new Female('영희', 22);

console.log(female1.name); // 영희
console.log(female1.age); // 22
console.log(female1.gender); // female

 

 

 

apply()

apply는 call과 다르게 인수가 담긴 배열을 받는다. 

 

function Person(name, age) {
    this.name = name;
    this.age = age;
}

function Female(name, age) {
    Person.apply(this, [name, age]);
    this.gender = "female";
}

const female1 = new Female('영희', 22);

console.log(female1.name); // 영희
console.log(female1.age); // 22
console.log(female1.gender); // female

 

반응형