본문 바로가기
카테고리 없음

this 키워드

by 찬찬2 2022. 11. 30.

객체는 메서드프로퍼티로 구성되어 있다.  동작을 나타내는 메서드는자신이 속한 객체의 상태, 즉 프로퍼티를 참조하고 변경할 수 있어야 한다. 이때 메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다.

 

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수다.

this는 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.

 

 

this가 가리키는 값, 즉, this 바인딩은 함수 호출방식에 의해 동적으로 결정된다.

 

■ 함수 호출방식

1. 일반 함수 호출

2. 메서드 호출

3. 생성자 함수 호출

 

1. 일반 함수 호출

- 전역 함수는 물론이고 중첩 함수, 콜백 함수(setTimeOut, map, etc...)를 일반함수로 호출하면 함수 내부의 this에는 전역 객체(window)가 바인딩된다.

 

function myFunc1(){
    console.log(this); // window
    
    function myFunc2(){
        console.log(this); // window
    }
}

myFunc1();
myFunc2();

 

2. 메서드 호출

- 메서드를 호출한 객체에 바인딩된다.

 

const person = {
    name: "chanki",
    getName(){
    	return this.name;
    }
}

console.log(person.getName()); // chanki

 

- 주의할 것은 메서드 내부의 this는 메서드를 소유한 객체가 아닌 메서드를 호출한 객체에 바인딩된다는 것이다. (객체에 포함된 것이 아니라 독립적으로 존재하는 별도의 객체다.)

 

 

const person = {
    name: "chanki",
    getName(){
    	return this.name;
    }
}

const anotherPerson = {
    name: "pureum"
}

// case#1 - getName 메서드를 anotherPerson 객체의 메서드로 할당
anotherPerson.getName = person.getName;

console.log(anotherPerson.getName()); // pureum

// case#2 - getName 메서드를 변수에 할당
const getName = person.getName;

console.log(getName()); // ''


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

// HTML 노드 객체가 출력된다.
document.getElementById("btn").addEventListener("click", handleClick);
document.getElementById("btn-0").onclick = handleClick;

 

3. 생성자 함수 호출

생성자 함수 내부의 this에는 생성자 함수가 (미래에) 생성할 인스턴스가 바인딩된다.

 

function Circle(radius){
    this.radius = radius;
    this.getDiameter = function(){
    	return 2 * this.radius;
    }
}

const circle1 = new Circle(5);
const circle2 = new Circle(10);

console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20

댓글