Front-end/Javascript

[JS] this에 대해 알아보자

집으로 감자 2025. 1. 7. 17:26

개념

this란?

this를 사용하는 환경에 따라 this가 가리키는 것이 달라진다

- this 안에는 호출을 누가 했는지에 대한 정보가 담긴다

 

전역 공간에서의 this

전역 공간에서의 this = 전역 객체

 

전역 공간에서의 this는 전역 객체를 가리킨다

프로그램이 구동되는 환경에 따라 전역 객체도 달라진다

 

브라우저 환경일 경우, this = window

VS code의 환경 node일 경우, this = global

 

📌 Runtime

프로그램이 구동 중인 환경

VS code를 사용하고 있을 때, Runtime = node 환경

크롬을 사용하고 있을 때,  Runtime = 브라우저 환경

 

Method로서 호출할 때 Method 내부의 this

method의 this = 호출의 주체
var obj = {
	method: function (x) { console.log(this, x) }
};
obj.method(1); // 출력: obj
obj['method'](2); // // 출력: obj

 

 

📌 method(메서드)

객체 안에 포함된 함수 (= 객체의 속성으로 정의된 함수)

- 자신을 호출한 대상 객체에 대한 동작을 수행한다

 

📌 method(메서드)와 함수의 차이

method와 다르게 함수는 호출의 주체가 존재하지 않다

그렇기 때문에 함수 내에 있는 this는 전역 개체를 가리킨다

 

method는 호출의 주체가 존재하기 때문에

method 내에 있는 this는 호출의 주체를 가리킨다

 

함수로서 호출할 때 함수 내부의 this

함수 내부의 this = 전역 객체

 

함수를 함수로서 호출할 때는 this가 지정되지 않는다

호출 주체를 알 수 없기 때문이다

그렇기 때문에 함수로서 독립적으로 호출할 때, this는 항상 전역 객체를 가리킨다

 

Method 내부 함수의 this를 우회하는 방법

✦ 변수 활용하기

메소드 내부의 this는 호출의 주체를 가리키기 때문에 함수 생성하기 전에 self라는 변수에 this를 할당한다

함수를 생성했을 때 this 대신 self를 넣게 된다면, obj1을 계속 선택할 수 있다

var obj1 = {
	outer: function() {
		console.log(this); // (1) 출력: obj1

		// AS-IS = 기존의 것
		var innerFunc1 = function() {
			console.log(this); // (2) 출력: 전역 객체
		}
		innerFunc1();

		// TO-BE = 이후의 것
		var self = this; // self라는 변수에 this(obj1)를 할당함
		var innerFunc2 = function() {
			console.log(self); // (3) 출력: obj1
		};
		innerFunc2();
	}
};

obj1.outer();

 

✦ 화살표 함수 이용하기

화살표 함수는 this 바인딩을 하지 않는다

this 바인딩 과정을 거치지 않기 때문에 이전의 this가 가리키고 있던 obj1을 그대로 유지한다

var obj = {
	outer: function() {
		console.log(this); // 출력: obj
		var innerFunc = () => {
			console.log(this); // (2) 출럭: obj
		};
		innerFunc();
	}
}

obj.outer();

 

생성자 함수 내부의 this

생성자 함수 내부의 this = 새롭게 생성된 인스턴스

 

생성자를 통해 새로운 인스턴스(= 객체)가 생성된다

이때 this는 새롭게 생성된 인스턴스를 가리킨다

새로운 인스턴스를 만들 때마다 this가 가리키는 것이 달라진다

var Cat = function (name, age) {
	this.bark = '야옹';
	this.name = name;
	this.age = age;
};

// 새로운 인스턴스 생성
var potato = new Cat('초코', 7); //this : potato
var ggang = new Cat('나비', 5);  //this : ggang

 

 

필요한 이유

this 객체 내부의 속성과 method를 참조하기 위해서 필요한 존재이다

 

 

반응형