JavaScript에서 this는 현재 실행 중인 함수의 컨텍스트를 참조하는데 사용되는데 즉, 자신이 속한 객체를 가리키는 변수입니다.
this가 특정 객체에 연결되는 것을 바인딩이라고 하는데 함수를 호출하는 방식에 따라 this의 값이 달라집니다.
객체의 메소드로 호출될 때, 메소드 내부에서 this는 그 메소드가 속한 객체 참조
const obj1 = { name: 'Lee', // 속성 sayName: function() { // 메서드 console.log(this.name); } } const obj2 = { name: 'Kim' } obj2.sayName = obj1.sayName; // obj2에 메서드 할당 obj1.sayName(); // Lee obj2.sayName(); // Kim
생성자 함수로 호출될 때, this는 새로 생성된 객체 참조
// 생성자 함수 정의 function Person(name, age) { // 1. 생성자 함수의 코드가 실행되기 전 빈 객체가 생성 // 생성자 함수 내에서 사용되는 this는 이 빈 객체를 가리킨다. this.name = name; this.age = age; // 2. this는 새로 생성된 객체를 가리키므로 this를 통해 생성한 프로퍼티와 메소드는 새로 생성된 객체에 추가 // 3. this에 바인딩된 새로 생성한 객체가 반환 } // 새로운 객체 생성 const person1 = new Person('Alice', 30); const person2 = new Person('Bob', 25); // 생성된 객체 출력 console.log(person1); // Person { name: 'Alice', age: 30 } console.log(person2); // Person { name: 'Bob', age: 25 }
만약 생성자 함수에 new 연산자를 붙이지 않고 호출하면 결과는 일반 함수를 호출했을 때와 같이 전역 객체 참조합니다.
call, apply, bind: call, apply, bind 메소드를 사용하여 명시적으로 this를 설정할 수 있습니다.
const obj1 = { name: '지원' }; const obj2 = { name: '지호' }; function sayName(greeting) { console.log(`${greeting}, ${this.name}!`); } // call 메소드 사용 sayName.call(obj1, 'Hello'); // Hello, 지원! sayName.call(obj2, 'Hi'); // Hi, 지호! // apply 메소드 사용 sayName.apply(obj1, ['안녕하세요']); // 안녕하세요, 지원! sayName.apply(obj2, ['반갑습니다']); // 반갑습니다, 지호! // bind 메소드 사용 const sayHelloToAlice = sayName.bind(obj1, 'Hello'); const sayHiToBob = sayName.bind(obj2, 'Hi'); sayHelloToAlice(); // Hello, 지원! sayHiToBob(); // Hi, 지호!
개발을 공부했을 때 this는 생각보다 일찍 접했다고 생각합니다. 그럴 때 단순히 '자기 자신을 가리킨다'라고 이해하고 넘어간 뒤로 크게 생각해보지 않았습니다. 이번 기회에 글을 쓰며 this에 대해 조금 더 이해 할 수 있어 좋은 시간을 가졌습니다.