๐ this๋ ๋ฌด์์ธ๊ฐ์?
์๋ฐ์คํฌ๋ฆฝํธ์์ this
๋ ํ์ฌ ์คํ ์ปจํ
์คํธ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํค์๋์์. ํจ์๋ ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋๋์ ๋ฐ๋ผ this
์ ๊ฐ์ด ๊ฒฐ์ ๋ผ์.
this
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์น ๋ ์คํ ๋์์ ์จ์ดํฐ๊ฐ ์ฃผ๋ฌธ์ ๋ฐ๋ ๊ณ ๊ฐ์ ์ ํํ ์์์ผ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ฌ๊ธฐ์ ์จ์ดํฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ด๊ณ , ๊ณ ๊ฐ์ this
๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์์. ์ด๋ค ํ
์ด๋ธ(์ปจํ
์คํธ)์์ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ, ์จ์ดํฐ(ํจ์)๋ ๋ค๋ฅธ ๊ณ ๊ฐ(this
)์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฒ ๋ผ์.
๐ฅ๏ธ this์ ์ฌ์ฉ
1. ์ ์ญ ์ปจํ
์คํธ์์์ this
- ์ ์ญ ์ปจํ
์คํธ์์
this
๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์. ๋ธ๋ผ์ฐ์ ์์๋window
, Node.js์์๋global
๊ฐ์ฒด๊ฐ ๋ผ์.
console.log(this.document === window.document); // ๋ธ๋ผ์ฐ์ ์์ true
console.log(this === global); // Node.js์์ true
์ด ์์ ์์ 'this.document'๋ ์ ์ญ ๊ฐ์ฒด์ธ 'window'์ 'document' ์์ฑ๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ 'this'๊ฐ ์ ์ญ ์ปจํ ์คํธ์์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํจ์ ๋ณด์ฌ์ค๋๋ค.
2. ํจ์ ์ปจํ
์คํธ์์์ this
- ํจ์ ๋ด์์
this
์ ๊ฐ์ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์.- ์ผ๋ฐ ํจ์์์
this
๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์. - ๋ฉ์๋๋ก์ ํธ์ถ๋ ํจ์์์
this
๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์.
- ์ผ๋ฐ ํจ์์์
function show() {
console.log(this === window); // true
}
const obj = {
show: function() {
console.log(this === obj); // true
}
};
show();
obj.show();
๐ค this์ ๋ฐ์ธ๋ฉ
this
์ ๋ฐ์ธ๋ฉ์ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋ผ์. ํ์ดํ ํจ์์ bind
, call
, apply
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ this
์ ๋ฐ์ธ๋ฉ์ ๋ช
์์ ์ผ๋ก ์ค์ ํ ์ ์์ด์.
1. ํ์ดํ ํจ์์์์ this
- ํ์ดํ ํจ์๋ ์์ ์ ํฌํจํ๋ ์ธ๋ถ ํจ์์
this
๊ฐ์ ์์๋ฐ์์.
const obj = {
show: function() {
const check = () => {
console.log(this === obj); // true
};
check();
}
};
obj.show();
2. bind
๋ฉ์๋
bind
๋ฉ์๋๋ ํจ์์this
๊ฐ์ ์๊ตฌ์ ์ผ๋ก ๋ฐ์ธ๋ฉํ ์ ์๊ฒ ํด ์ค์.
const person = {
name: 'John',
greet: function() { console.log(`Hello, ${this.name}`); }
};
const greetJohn = person.greet.bind(person);
greetJohn(); // "Hello, John"
์ฌ๊ธฐ์ 'greetJohn' ํจ์๋ 'person.greet' ํจ์์ 'person' ๊ฐ์ฒด๋ฅผ 'this'๋ก ๋ฐ์ธ๋ฉํ ์๋ก์ด ํจ์์ ๋๋ค.
'bind'๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, 'greetJohn'์ ํธ์ถํ ๋๋ง๋ค 'this.name'์ ํญ์ 'person.name'์ ์ฐธ์กฐํฉ๋๋ค.
3. call
๊ณผ apply
๋ฉ์๋
call
๊ณผapply
๋ฉ์๋๋ ํจ์๋ฅผ ์ฆ์ ํธ์ถํ๋ฉด์this
์ ๊ฐ์ ์ค์ ํ ์ ์์ด์.call
์ ๊ฐ๋ณ ์ธ์๋ฅผ,apply
๋ ์ธ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์.
function introduce(greeting, punctuation) {
console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}
const person = { name: 'Jane' };
introduce.call(person, 'Hello', '!'); // "Hello, my name is Jane!"
introduce.apply(person, ['Hi', '.']); // "Hi, my name is Jane."
์ด ์์ ์์ 'introduce' ํจ์๋ 'call'๊ณผ 'apply'๋ฅผ ์ฌ์ฉํ์ฌ 'person' ๊ฐ์ฒด์ 'name' ์์ฑ์ 'this.name'์ผ๋ก ์ฐธ์กฐํ๋๋ก ํฉ๋๋ค.
'call'๊ณผ 'apply'์ ์ฐจ์ด๋ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ์์ต๋๋ค.
๐จ ์ฃผ์ํ ์
- ํ์ดํ ํจ์์์๋
this
๊ฐ ํจ์ ์์ฒด์ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง์ง ์์ผ๋ฏ๋ก,this
๋ฅผ ํ์ดํ ํจ์ ๋ด์์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํด์. - ์๊ฒฉ ๋ชจ๋(
use strict
)์์ ์ผ๋ฐ ํจ์ ๋ด์this
๋undefined
๊ฐ ๋ผ์.
๐ ๊ฒฐ๋ก
this
๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ผ๋ก, ํจ์๋ ๋ฉ์๋๊ฐ ์คํ๋๋ ํ์ฌ ์ปจํ
์คํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํด์. this
์ ๋ฐ์ธ๋ฉ์ ํจ์์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก, ๋ค์ํ ์ํฉ์์ this
๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํด์.
๐ ์ถ๊ฐ ์ ๋ณด
- ์๋ฐ์คํฌ๋ฆฝํธ์
this
์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์ํ์ ๋ค๋ฉด, MDN Web Docs์์ ์์ธํ ์ ๋ณด๋ฅผ ์ฐพ์๋ณผ ์ ์์ด์.
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ๊ตฌ์กฐ ๋ถํด ํ ๋น(Destructuring) (0) | 2024.04.21 |
---|---|
[JavaScript] ํด๋ก์ (0) | 2024.03.23 |
[JavaScript] ES6 (0) | 2024.01.25 |
[JavaScript] async/await (0) | 2023.12.15 |
[JavaScript] ์ฝ๋ฐฑ ํจ์(Callback Function) (0) | 2023.12.14 |
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!