JavaScript๋ฅผ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด this๋ผ๋ ํค์๋๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋ฉ๋๋ค. this๋ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ํน๋ณํ ํค์๋๋ก, ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ ์คํ ์ปจํ ์คํธ๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ฉด ์ฝ๋๊ฐ ์๋์น ์๊ฒ ๋์ํ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ this๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง, ๋ค์ํ ์ํฉ์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ํจ์ ๋ด์์ ์ฌ์ฉ๋ฉ๋๋ค. ํจ์์ ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
01. this์ ๋์ ์๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ๐ง
๊ธฐ๋ณธ์ ์ธ this์ ๋์ ๋ฐฉ์
์๋ฐ์คํฌ๋ฆฝํธ this๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ฐธ์กฐํ๋ ๋์์ด ๋ฌ๋ผ์ง๋๋ค. ์ ์ญ ์ปจํ ์คํธ์ ํจ์ ๋ด๋ถ์์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋์ํ์ฃ .
console.log(this); // ์ ์ญ ๊ฐ์ฒด (๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ์ฒด)
์ ์ญ ์ปจํ ์คํธ์์์ this
์ ์ญ ์ปจํ ์คํธ์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ window ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค.
function globalThis() {
console.log(this);
}
globalThis(); // window ๊ฐ์ฒด
ํจ์ ๋ด๋ถ์์์ this
์ผ๋ฐ ํจ์์์๋ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ this๊ฐ ๋ฌ๋ผ์ง๋๋ค.
function regularFunction() {
console.log(this);
}
regularFunction(); // window ๊ฐ์ฒด (์๊ฒฉ ๋ชจ๋์์๋ undefined)
02. ๋ฉ์๋์์์ this ์ฌ์ฉ๋ฒ๐ผ
๊ฐ์ฒด ๋ฉ์๋์์์ this
๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋ ํจ์์์๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
const obj = {
name: 'JavaScript',
getName: function() {
console.log(this.name);
}
};
obj.getName(); // 'JavaScript'
์์ฑ์ ํจ์์์์ this
์์ฑ์ ํจ์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ฉฐ, this๋ ์์ฑ๋๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
function Person(name) {
this.name = name;
}
const person = new Person('John');
console.log(person.name); // 'John'
03. ์ฝ๋ฐฑ ํจ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์์ this๐๏ธ
์ฝ๋ฐฑ ํจ์์์์ this
์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this๋ ํธ์ถ๋๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด bind, apply, call ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ๋ฉ์๋์ ์ฌ์ฉ๋ฒ๊ณผ ํน์ง์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- bind: this ๊ฐ์ ์ค์ ํ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํฉ๋๋ค.
- call: ํจ์๋ฅผ ํธ์ถํ๋ฉด์ this ๊ฐ์ ์ค์ ํ๊ณ , ์ธ์๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ฌํฉ๋๋ค.
- apply: ํจ์๋ฅผ ํธ์ถํ๋ฉด์ this ๊ฐ์ ์ค์ ํ๊ณ , ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ์ ๋ฌํฉ๋๋ค.
bind ๋ฉ์๋
bind ๋ฉ์๋๋ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ , this ๊ฐ์ ์ค์ ํ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋ ๋ this๊ฐ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ ์ ์์ต๋๋ค.
const obj = {
name: 'Alice',
getName: function() {
console.log(this.name);
}
};
const callback = obj.getName.bind(obj);
callback(); // 'Alice' ์ถ๋ ฅ
const anotherObj = {
name: 'Bob',
getName: callback
};
anotherObj.getName(); // 'Alice' ์ถ๋ ฅ (bind๋ก ์ค์ ๋ this๊ฐ ์ ์ง๋จ)
์์ : bind๋ฅผ ์ฌ์ฉํ ์ฝ๋ฐฑ ํจ์์์์ this ์ ์ด
const obj = {
name: 'Alice',
getName: function() {
console.log(this.name);
}
};
function executeCallback(cb) {
cb();
}
const boundCallback = obj.getName.bind(obj);
executeCallback(boundCallback); // 'Alice' ์ถ๋ ฅ
call ๋ฉ์๋
call ๋ฉ์๋๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด์ this ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก this ๊ฐ์ ์ ๋ฌํ๊ณ , ๊ทธ ๋ค์ ํจ์์ ์ธ์๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ฌํฉ๋๋ค.
function greet(greeting) {
console.log(greeting + ', ' + this.name);
}
const person = { name: 'Alice' };
greet.call(person, 'Hello'); // 'Hello, Alice' ์ถ๋ ฅ
์์ : call์ ์ฌ์ฉํ ์ฝ๋ฐฑ ํจ์์์์ this ์ ์ด
const obj = {
name: 'Alice',
getName: function() {
console.log(this.name);
}
};
function executeCallback(cb) {
cb.call(obj); // ๋ช
์์ ์ผ๋ก this ์ค์
}
executeCallback(obj.getName); // 'Alice' ์ถ๋ ฅ
apply ๋ฉ์๋
apply ๋ฉ์๋๋ call๊ณผ ์ ์ฌํ์ง๋ง, ํจ์์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ์ ๋ฌํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก this ๊ฐ์ ์ค์ ํ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ์ธ์ ๋ฐฐ์ด์ ์ ๋ฌํฉ๋๋ค.
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'Alice' };
greet.apply(person, ['Hello', '!']); // 'Hello, Alice!' ์ถ๋ ฅ
์์ : apply๋ฅผ ์ฌ์ฉํ ์ฝ๋ฐฑ ํจ์์์์ this ์ ์ด
const obj = {
name: 'Alice',
getName: function() {
console.log(this.name);
}
};
function executeCallback(cb) {
cb.apply(obj); // ๋ช
์์ ์ผ๋ก this ์ค์
}
executeCallback(obj.getName); // 'Alice' ์ถ๋ ฅ
์ด๋ฒคํธ ํธ๋ค๋ฌ์์์ this
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM ์์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด ๊ธฐ๋ณธ ๋์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ํธ์ถ๋ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ this๋ฅผ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ํตํด this๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ๊ฑฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค. ๊ฐ ๊ฒฝ์ฐ์ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ ์ด๋ฒคํธ ํธ๋ค๋ฌ
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์์ this๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM ์์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
const button = document.getElementById('myButton');
button.addEventListener('click', function() {
console.log(this); // ํด๋ฆญ๋ ๋ฒํผ ์์๋ฅผ ์ถ๋ ฅ
});
ํ์ดํ ํจ์๋ก์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ
ํ์ดํ ํจ์๋ ์์ ๋ง์ this๋ฅผ ๊ฐ์ง์ง ์๊ณ , ์ ์๋ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ์ต๋๋ค. ๋ฐ๋ผ์ ํ์ดํ ํจ์๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ this๊ฐ ์ฐธ์กฐ๋ ์ ์์ต๋๋ค.
const button = document.getElementById('myButton');
button.addEventListener('click', (event) => {
console.log(this); // ์์ ์ค์ฝํ์ this๋ฅผ ์ถ๋ ฅ (์ ์ญ ๊ฐ์ฒด ๋๋ undefined)
});
bind๋ฅผ ์ด์ฉํ this ์ค์
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this๋ฅผ ํน์ ๊ฐ์ฒด๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const obj = {
name: 'Alice',
handleClick: function() {
console.log(this.name); // 'Alice'๋ฅผ ์ถ๋ ฅ
}
};
const button = document.getElementById('myButton');
button.addEventListener('click', obj.handleClick.bind(obj));
call๊ณผ apply๋ฅผ ์ด์ฉํ this ์ค์
call๊ณผ apply๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ this๋ฅผ ์ค์ ํ ์ ์์ง๋ง, ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ง์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ญ ๋๋ค. ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ๋ค๋ฅธ ํจ์ ํธ์ถ ์ ์ฌ์ฉ๋ฉ๋๋ค.
const obj = {
name: 'Alice',
handleClick: function() {
console.log(this.name); // 'Alice'๋ฅผ ์ถ๋ ฅ
}
};
const button = document.getElementById('myButton');
button.addEventListener('click', function(event) {
obj.handleClick.call(obj);
});
์ด๋ฒคํธ ํธ๋ค๋ฌ์์์ this๋ฅผ ์ ์ดํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ
1. ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ this ์ ์ฅํ๊ธฐ
const obj = {
name: 'Alice',
handleClick: function() {
console.log(this.name);
}
};
const button = document.getElementById('myButton');
button.addEventListener('click', function(event) {
const self = this; // ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ฅผ ์ฐธ์กฐ
obj.handleClick.call(obj); // 'Alice' ์ถ๋ ฅ
console.log(self); // ํด๋ฆญ๋ ๋ฒํผ ์์๋ฅผ ์ถ๋ ฅ
});
2. ๋ฐ์ดํฐ ์์ฑ์ ์ฌ์ฉํ์ฌ this ์ ๋ฌ
HTML:
<button id="myButton" data-name="Alice">Click me</button>
JavaScript:
const button = document.getElementById('myButton');
button.addEventListener('click', function(event) {
const name = this.dataset.name; // data-name ์์ฑ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
console.log(name); // 'Alice' ์ถ๋ ฅ
});
์์ฝ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM ์์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ํ์ดํ ํจ์๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ฉด this๋ ์์ ์ค์ฝํ์ this๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this๋ฅผ ํน์ ๊ฐ์ฒด๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- call๊ณผ apply๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ํธ์ถ ์ this๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ this๋ฅผ ์ ์ดํ๊ธฐ ์ํด self๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, HTML ๋ฐ์ดํฐ ์์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
04. ํ์ดํ ํจ์์์์ this๐
JavaScript์์ ํ์ดํ ํจ์๋ ์ผ๋ฐ ํจ์์ this์ ๋์ ๋ฐฉ์์ด ๋ค๋ฆ
๋๋ค. ํ์ดํ ํจ์๋ ์์ฒด์ ์ธ this ๋ฐ์ธ๋ฉ์ ๊ฐ์ง ์๊ณ , ์์ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ์ต๋๋ค. ์ด๋ ํ์ดํ ํจ์๊ฐ ์ ์๋ ๋ฌธ๋งฅ(context)์ ์ ์งํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐ๋ผ์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ ํจ์์์ this๊ฐ ํผ๋๋ ์ ์๋ ์ํฉ์ ํผํ ์ ์์ต๋๋ค. ํ์ดํ ํจ์๋ this๊ฐ ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก, ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ this ๋ฐ์ธ๋ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ฃผ์ ํน์ง
1. ํ์ดํ ํจ์๋ ์์ ์ this๋ฅผ ๊ฐ์ง์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํจ์๋ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ this๊ฐ ๋ฌ๋ผ์ง์ง๋ง, ํ์ดํ ํจ์๋ ์ ์๋ ๋์ ์ค์ฝํ์ this๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. ์์ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ์ต๋๋ค.
- ํ์ดํ ํจ์ ๋ด๋ถ์์ this๋ ํ์ดํ ํจ์๊ฐ ์ ์๋ ์์น์ ์์ ์ค์ฝํ์ this์ ๋์ผํฉ๋๋ค.
์์ ์ ์ค๋ช
1. ์ผ๋ฐ ํจ์์ this
const obj = {
name: 'Alice',
regularFunction: function() {
console.log(this.name); // 'Alice'
}
};
obj.regularFunction(); // 'Alice' ์ถ๋ ฅ
2. ํ์ดํ ํจ์์ this
const obj = {
name: 'Alice',
arrowFunction: () => {
console.log(this.name); // ์์ ์ค์ฝํ์ `this`๋ฅผ ์ฐธ์กฐ
}
};
obj.arrowFunction(); // ์์ ์ค์ฝํ๊ฐ ์ ์ญ ๊ฐ์ฒด์ด๋ฉด `undefined` ์ถ๋ ฅ
3. ์์ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ๋ ํ์ดํ ํจ์
ํ์ดํ ํจ์๋ ์์ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ์ต๋๋ค. ์ด ์์ ์์ ํ์ดํ ํจ์๋ ๊ฐ์ฒด ๋ฉ์๋ ๋ด๋ถ์์ ์ ์๋์์ผ๋ฏ๋ก, ์์ ์ค์ฝํ์ this๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
const obj = {
name: 'Alice',
regularFunction: function() {
const arrowFunction = () => {
console.log(this.name); // 'Alice'
};
arrowFunction();
}
};
obj.regularFunction(); // 'Alice' ์ถ๋ ฅ
4. ์ฝ๋ฐฑ ํจ์๋ก์์ ํ์ดํ ํจ์
์ฝ๋ฐฑ ํจ์๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ์์ ์ค์ฝํ์ this๋ฅผ ์ ์งํฉ๋๋ค.
const obj = {
name: 'Alice',
init: function() {
document.getElementById('myButton').addEventListener('click', () => {
console.log(this.name); // 'Alice'
});
}
};
obj.init();
์ด ์์ ์์ click ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ฌ์ฉ๋ ํ์ดํ ํจ์๋ init ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋์ this๋ฅผ ์ ์งํ๋ฏ๋ก, this.name์ 'Alice'๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์ฃผ์์ฌํญ
1. ๊ธ๋ก๋ฒ ์ปจํ ์คํธ์์ ํ์ดํ ํจ์ ์ฌ์ฉ
ํ์ดํ ํจ์๊ฐ ์ ์ญ ์ปจํ ์คํธ์์ ์ ์๋ ๊ฒฝ์ฐ, this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
const arrowFunction = () => {
console.log(this); // ์ ์ญ ๊ฐ์ฒด (๋ธ๋ผ์ฐ์ ์์๋ `window`, Node.js์์๋ `global`)
};
arrowFunction();
2. ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฉ์๋๋ก์์ ํ์ดํ ํจ์ ์ฌ์ฉ
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฉ์๋๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๊ฒฝ์ฐ, this๋ ์์ ์ค์ฝํ์ this๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
const obj = {
name: 'Alice',
arrowFunction: () => {
console.log(this.name); // ์์ ์ค์ฝํ์ `this`๋ฅผ ์ฐธ์กฐ (์ ์ญ ๊ฐ์ฒด)
}
};
obj.arrowFunction(); // `undefined` ์ถ๋ ฅ
์์ฝ
- ํ์ดํ ํจ์๋ ์์ ์ this ๋ฐ์ธ๋ฉ์ ๊ฐ์ง์ง ์๊ณ , ์์ ์ค์ฝํ์ this๋ฅผ ์์๋ฐ์ต๋๋ค.
- ์ฝ๋ฐฑ ํจ์๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์์ ์ค์ฝํ์ this๋ฅผ ์ ์งํ์ฌ ํผ๋์ ํผํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฉ์๋๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ผ๋ฉฐ, ์ผ๋ฐ ํจ์ ํํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
05. this๋ฅผ ์ฌ์ฉํ ์์ ๐ง
์์ 1: ๊ฐ์ฒด ๋ด๋ถ์ ๋ฉ์๋์์ this ์ฌ์ฉํ๊ธฐ
// ๊ฐ์ฒด ์์ฑ
const person = {
firstName: 'John',
lastName: 'Doe',
fullName: function() {
// ์ฌ๊ธฐ์ this๋ person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
return this.firstName + ' ' + this.lastName;
}
};
// fullName ๋ฉ์๋ ํธ์ถ
console.log(person.fullName()); // ์ถ๋ ฅ: John Doe
์ ์์ ์์ this๋ person ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค. person.fullName()์ด ํธ์ถ๋ ๋, this๋ person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก this.firstName๊ณผ this.lastName๋ John๊ณผ Doe๋ฅผ ๋ฐํํฉ๋๋ค.
์์ 2: ์์ฑ์ ํจ์์์ this ์ฌ์ฉํ๊ธฐ
// ์์ฑ์ ํจ์ ์ ์
function Car(make, model) {
this.make = make;
this.model = model;
this.getCarInfo = function() {
// ์ฌ๊ธฐ์ this๋ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
return this.make + ' ' + this.model;
};
}
// Car ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์์ฑ
const myCar = new Car('Toyota', 'Corolla');
// getCarInfo ๋ฉ์๋ ํธ์ถ
console.log(myCar.getCarInfo()); // ์ถ๋ ฅ: Toyota Corolla
์ ์์ ์์ this๋ Car ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. myCar.getCarInfo()๋ฅผ ํธ์ถํ ๋ this๋ myCar ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก this.make๊ณผ this.model์ Toyota์ Corolla๋ฅผ ๋ฐํํฉ๋๋ค.
์์ 3: ํจ์ ํธ์ถ ์ this์ ๋์ ๋ฐ์ธ๋ฉ
// ์ผ๋ฐ ํจ์ ์ ์
function greet() {
console.log('Hello, ' + this.name);
}
// ๋ค์ํ ๊ฐ์ฒด ์์ฑ
const obj1 = { name: 'Alice' };
const obj2 = { name: 'Bob' };
// ํจ์ ํธ์ถ ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ this์ ๋ฐ์ธ๋ฉ
greet.call(obj1); // ์ถ๋ ฅ: Hello, Alice
greet.call(obj2); // ์ถ๋ ฅ: Hello, Bob
์ ์์ ์์ call() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ greet() ํจ์๋ฅผ ํธ์ถํ ๋ this๋ฅผ obj1๊ณผ obj2๋ก ๊ฐ๊ฐ ๋ฐ์ธ๋ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด greet() ํจ์ ๋ด๋ถ์ this.name์ ๊ฐ ๊ฐ์ฒด์ name ์์ฑ ๊ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.