this
์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ก, ์ธํฐํ๋ฆฌํฐ์ ์ํด ์ค ๋จ์๋ก ์ฝํ ํด์๋์ด ์คํ๋๋ค.
์ธํฐํ๋ฆฌํฐ์ ์ํด ํ์ฌ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๊ฒฝ์ ์คํ ์ปจํ ์คํธ๋ผ๊ณ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์์ ์ด๋ฌํ ์คํ ์ปจํ ์คํธ๋ฅผ ์คํ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ์คํ๋๋ ์์ ์ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์คํ ์ปจํ ์คํธ๋ฅผ this๊ฐ ๊ฐ๋ฆฌํจ๋ค.
์ฆ, this๋ ํ์ฌ ์คํ๋๋ ์ฝ๋์ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
this ํค์๋
์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค(์์ฑ์ํจ์ ๋๋ class ์ด์ฉ)๋ฅผ ๊ฐ๋ฆฌํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์
์๊ธฐ ์ฐธ์กฐ ๋ณ์ (self-reference variable)
์ง์ญํ์๋ฉด ์ค์ค๋ก๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์
๊ฐ์ฒด ๋ด๋ถ์์์ this๋, ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์์ฑ์ํจ์ ๋๋ class ๋ด๋ถ์ this๋, ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ฌ๊ธฐ์ ๊ฐ๋ฆฌํจ๋ค๋ ๋ค๋ฅธ ๋ง๋ก ํํํ๋ฉด ๋ฐ์ธ๋ฉ(binding)์ด๋ผ๊ณ ํ๋ค.
- this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- this๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋๋ฉฐ, ์ฝ๋ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค.
[์์] - ์์ ์ง๋ฆ ๊ตฌํ๊ธฐ
const circle = {
radius: 5, // ํ๋กํผํฐ: ๊ฐ์ฒด ๊ณ ์ ์ ์ํ ๋ฐ์ดํฐ
getDiameter() { // ๋ฉ์๋: ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์กฐ์ํ๋ ๋์
return 2 * this.radius; // thiss๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด
}
};
console.log(circle.getDiameter()); // 10
- ์๋ฐ์คํฌ๋ฆฝํธ์ thiss๋ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ this์ ๋ฐ์ธ๋ฉ๋ ๊ฐ, ์ฆ this ๋ฐ์ธ๋ฉ์ด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
this ๋ฐ์ธ๋ฉ
this ๋ฐ์ธ๋ฉ์ this์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ผ๋ก ํจ์ ํธ์ถ ๋ฐฉ์์ด๋ค.
ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง, ํธ์ถ ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ this๊ฐ ์ด๋์ ๋ฐ์ธ๋ฉ ๋ ์ง ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
ํจ์ ํธ์ถ ๋ฐฉ์
- ์ผ๋ฐ ํจ์ ํธ์ถ
- ๋ฉ์๋ ํธ์ถ
- ์์ฑ์ ํจ์ ํธ์ถ (๊ฐ์ฒด ์์ฑ ํจ์)
- Call, Apply, Bind ๋ฉ์๋ ํธ์ถ
1. ์ผ๋ฐ ํจ์ ํธ์ถ
const obj = function(){
console.log(this); // ์ ์ญ window
}
obj();
- ๊ธฐ๋ณธ์ ์ผ๋ก this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
- ์ด๋ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๋ด๋ถ ํจ์๋ ์ผ๋ฐ ํจ์, ๋ฉ์๋, ์ฝ๋ฐฑ ํจ์ ์ด๋์์ ์ ์ธ ๋์๋ ๊ด๊ณ์์ด this๋ ๋ชจ๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
2. ๋ฉ์๋ ํธ์ถ
var person = {
name: 'kim',
printName: function() {
console.log(this.name);
}
}
person.printName()
- ๋ฉ์๋ ํธ์ถ: ๊ฐ์ฒด์ ๊ฐ์ด ํจ์๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ๋ฅผ ๋งํจ
- this: ํด๋น ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
3. ์์ฑ์ ํจ์ ํธ์ถ
var instatnce = new obj();
- ์์ฑ์ ํจ์: ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋ค.
- ์์ฑ์ ํจ์์ ๋์ ๊ณผ์
- ๋น ๊ฐ์ฒด ์์ฑ ๋ฐ this ๋ฐ์ธ๋ฉ
- ์์ฑ์ ํจ์๊ฐ ์คํ๋๊ธฐ ์ , ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ด๋ this๋ก ๋ฐ์ธ๋ฉ๋๋ค.
- this๋ฅผ ํตํ ํ๋กํผํฐ ์์ฑ
- ์์ฑ๋ ๊ฐ์ฒด ๋ฐํ
- ๋น ๊ฐ์ฒด ์์ฑ ๋ฐ this ๋ฐ์ธ๋ฉ
- this: ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ ๊ฐ์ฒด์ ์์ฑ์ ํ ๋นํ๊ธฐ ์ํด this ํค์๋๋ฅผ ์ฌ์ฉ
4. Call, Apply, Bind ๋ฉ์๋ ํธ์ถ - ๋ช ์์ this ๋ฐ์ธ๋ฉ
์ด ๋ฉ์๋๋ฅผ ํตํด this๋ฅผ ํน์ ๊ฐ์ฒด์ ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
- Call, Apply : ํจ์๋ฅผ ํธ์ถ
- ๋ํ์ ์ผ๋ก ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํ์ฉ
- code์ฝ๋์์ apply๋ฅผ ํตํด ์์ฑ์ ํจ์ person ๋ด๋ถ์ this์ ๊ฐ์ฒด obj๋ฅผ ๋ฐ์ธ๋ฉ์์ผฐ๋ค.
- const Person = function (name) { this.name = name; }; const obj = {}; Person.apply(obj, ['name']); console.log(obj); // {name: 'name'}
- bind : this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ง ์ ๋ฌ
- ๋ฉ์๋์ this์ ๋ฉ์๋ ๋ด๋ถ์ ์ค์ฒฉ ํจ์ ๋๋ ์ฝ๋ฐฑ ํจ์์ this๊ฐ ๋ถ์ผ์นํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ
- code์ฌ๊ธฐ์ bind๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด this๋ person์ ๊ฐ์ฒด๊ฐ ์๋ ์ผ๋ฐํจ์์์ ํธ์ถ๋์ด ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
- const person = { name: 'kim', obj(callback){ setTimeout(callback.bind(this),100); } }; person.obj(function(){ console.log(`my name is ${this.name}`); });
์ ๋ฆฌ
๐ก ํจ์ ํธ์ถ์์์ this: ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋จ
๐ก ๋ฉ์๋ ํธ์ถ์์์ this: ํด๋น ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ
๐ก ์์ฑ์ ํจ์์์์ this: this๋ ๊ฐ์ฒด ์์ฑ ํ ๋น์ ์ํด ์ฌ์ฉ
๐ก ๋ช ์์ this ๋ฐ์ธ๋ฉ: ํน์ ๊ฐ์ฒด์ ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋จ
- this๋ ํจ์์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ฒ๋๋ค.
- ์์ฑ์ ํจ์ ๋ด๋ถ์์ this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค์ ๋ฐ์ธ๋ฉ๋๋ค.
- Call, Apply, Bind ๋ฉ์๋ ์ฌ์ฉ ์, ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
- Object.method ํํ์ ๊ฐ์ด ๊ฐ์ฒด ๋ด์์ ํธ์ถํ ๊ฒฝ์ฐ, this๋ ํด๋น ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
- 2,3,4๋ฅผ ์ ์ธํ ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ ๊ฒฝ์ฐ, this๋ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
- ES6์ ํ์ดํ ํจ์ ๋ด์์ this๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ, this๋ ์์ ์ค์ฝํ์ this์ ๋ฐ์ธ๋ฉ๋๋ค.
this๋ ์คํ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. ์ด๋ฅผ ์์ฉํด ์ด๋ฒคํธ ํจ์๊ฐ ํธ์ถ๋๋ฉด this๋ ํด๋น ์ด๋ฒคํธ ๊ฐ์ฒด์ ํ ๋น๋๊ฒ ๊ตฌ๋ ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
์ฐธ๊ณ ๋ฌธํ