์ด๋ฒ ํฌ์คํ ์์๋ ํญ์ ํท๊ฐ๋ ธ๋..๐ this์ ๋ํด์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ์ ๋ง ๋ง์ด ์ฌ์ฉ๋๋ ํค์๋์ด๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด this์ ๋ํด์ ๊ผญ ์์๋์ด์ผ ํ๋ค.
this์ ๊ฐ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํจ์๋ฅผ ํธ์ถํ ๋ฐฉ๋ฒ์ ์ํด ๊ฒฐ์ ๋๋ค. ๋ ์์ธํ ๋งํ๋ฉด this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์, ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ณํ๋ค. this์ ๊ฐ์ด ์ด๋ป๊ฒ ํ ๋น๋๋์ง ์์๋ณด์.
this ๋ฐ์ธ๋ฉ์ ๊ธฐ๋ณธ ์์น 3๊ฐ์ง๋ฅผ ๊ธฐ์ตํ์!
- ์ผ๋ฐ ํจ์ ํธ์ถ์์ this๋ window๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
- ๋ฉ์๋ ํธ์ถ์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ๋ค.
- ์์ฑ์ ํจ์ ํธ์ถ์์ this๋ ์์ฑ๋ instance๋ฅผ ๊ฐ๋ฅดํจ๋ค.
๊ฐ๊ฐ์ ์์น์ ์ฝ๋๋ฅผ ํตํด ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด๋ฉฐ ์ดํดํด๋ณด์. ๐
์ฒ์ ์์ ๋ ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ ์์น์ ๋์์ ํ์ธํด ๋ณด๋ ์์ ์ด๋ค.
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, obj.foo()๋ก ํธ์ถ์ด ๋์์๋, ์์ ๊ฐ์ฒด์ธ obj๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์ฆ ๋ฉ์๋๋ก ํธ์ถ ๋์์๋ ๋ฉ์๋ ์ด๋ฆ ์์ ๋ง์นจํ(.) ์์ ๊ธฐ์ ํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด, bar() ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ, ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด this์๋ window๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ์์๋ฅผ ์ดํด๋ณด์
์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ฐ์ ๋ฉ์๋๋ฅผ ์คํํ๋๋ผ๋ ์คํ ๋ฐฉ์์ ๋ฐ๋ผ this์ binding ๋๋ ๊ฐ์ฒด๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
obj.foo๋ก ๋ฉ์๋๋ก์ ์คํ ๋์๋ this๋ obj์ ๋ฐ์ธ๋ฉ ๋์ง๋ง, ๋ณ์ a์ ๋์ ๋์ด ์ผ๋ฐ ํจ์๋ก์ ์คํ ๋์๋๋ window ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
์ฆ this๋ ๋ฐํ์์์ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ new ํค์๋์ ํจ๊ป ํธ์ถ๋๋ฉด ์๋กญ๊ฒ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
function C() {
this.a = 37; // this๋ ์์ฑ์ ํจ์๋ฅผ ํตํด ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅดํจ๋ค
}
let newObject = new C();
console.log(newObject.a); // 37
function C2() {
this.a = 37;
// ์์๋ก a = 38์ ๊ฐ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ
return {a: 38};
}
let newObject2 = new C2();
console.log(newObject2.a); // 38
์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด this๋ ์๋กญ๊ฒ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅดํจ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ถ๊ฐ์ ์ผ๋ก ํ๋์ ์์ ๋ฅผ ๋ ์ดํด๋ณด์.
object ์์ ์๋ ๋ฉ์๋๋ผ๊ณ ํ๋๋ผ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋์ ๋์ด์ ์คํ ๋ ์ ์๋ค. ๊ทธ ์ด์ ๋ object์์ ์์ฑ๋ sayName ๋ฉ์๋๋ obj1์ ํฌํจ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ก์ ์ธ๋ถ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ์ง sayName ํ๋กํผํฐ๊ฐ function์ ๊ฐ๋ฅดํค๊ณ ์์ ๋ฟ์ด๋ค.
๋ฐ๋ผ์ sayName์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ ๋ ์๋ ์๊ณ ์ผ๋ฐ ๋ณ์์ ๋ด์์ ธ ์ผ๋ฐ ํจ์๋ก ํธ์ถ ๋ ์๋ ์๋ค.
์์์ ์ผ๋ฐ this์ ๋ํด์ ์ดํด๋ณด์๋ค. ๊ทธ๋ ๋ค๋ฉด ES6์์ ์๋ก ์ถ๊ฐ๋ ์ฌ์์ธ ํ์ดํ ํจ์์์ this๋ ์ด๋ค ์ ์ด ๋ค๋ฅผ๊น?
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์, ํ์ดํ ํจ์๋ this ๋ฐ์ธ๋ฉ์ด ์๋ค๋ ๊ฒ์ด๋ค. ํ์ดํ ํจ์๋ ํจ์ ์์ฒด์ this, argument, super, new.target ๋ฐ์ธ๋ฉ์ ๊ฐ์ง์๋๋ค.
๋ฐ๋ผ์ ํ์ดํ ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฐธ์กฐํ๋ฉด ์์ ์ค์ฝํ์ this๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๊ฒ ๋๋ค.
๋ค์ ์์๋ฅผ ๋ณด์.
const counter = {
num: 1,
increase: () => ++this.num
};
console.log(counter.increase()); // NaN
ํ์ดํ ํจ์๋ this๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ ์ค์ฝํ์ธ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ this.num์ ์ ์ญ๊ฐ์ฒด์ num์ ์ฐธ์กฐํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ undefined์ ++์ฐ์ฐ์ ํ๊ธฐ ๋๋ฌธ์ NaN์ ๋ฐํํ๋ค.
์์ ์์ ๋ฅผ ๋ณด๋ฉด ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๊ฝค๋ ๋ถํธํด ๋ณด์ธ๋ค. ๊ทธ๋ ๋ค๋ฉด ํ์ดํ ํจ์๋ ์ ES6์์ ์๋ก ๋์ ๋์์๊น?
ํ์ดํ ํจ์๋ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๊ฐ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค!
๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(function (item) {
return this.prefix + item; // TypeError: Cannot read property 'prefix' of undefined
});
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
Prefixer ๋ด๋ถ์ add ๋ฉ์๋๋ฅผ ์ดํด๋ณด์. ๊ฐ๋ฐ์๊ฐ ์๋ํ ๋์์ ์ ๋ฌํ ๋ฐฐ์ด์ ์์๋ฅผ ๋๋ฉฐ prefix์ธ '-webkit-'์ ๋ถ์ธ ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ arr.map์์์ this๋ ์ ์ญ ๊ฐ์ฒด์ธ window๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ prefix๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ๊ธฐ์กด์๋ bind๋ฅผ ํตํด this๋ฅผ bindingํ์ฌ ํด๊ฒฐํ์ฌ์ผ ํ๋ค. ES6 ์ด์์ ๊ฐ๋ฐํ๊ฒฝ์์๋ ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
class Prefixer {
constructor(prefix) {
this.prefix = prefix;
}
add(arr) {
return arr.map(item => this.prefix + item);
}
}
const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
// ['-webkit-transition', '-webkit-user-select']
ํ์ดํ ํจ์๋ this ๋ฐ์ธ๋ฉ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ์ค์ฝํ์ธ Prefixer class๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค.
๋ํ class ์์์์ this๋ ์๋ก ๋ง๋ค์ด์ง ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์,
ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ํ๋ ๋๋ก ๋์ํ๋๋ก ๊ตฌํํ ์ ์๋ค.๐
https://poiemaweb.com/js-this
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this