this - ChoDragon9/posts GitHub Wiki
์ถ์ฒ : [๋์ฝ๋ผ์ค ์์นด์ค] ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ
ES5์์ this๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์๋ this์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ฐํธ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ธฐ์ ๋ฉด์ ์ ์ง๋ฌธ์ ๋ฐ์๋ดค์ ๋งํ ๋จ๊ณจ ๋ฌธ์ ์ด๊ธฐ๋ ํ๋ค. ์ด ๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ฌธํ ๋ ํ๋์ ์ฐ์ด ์๋ this๋ฅผ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
this
๋ ํธ์ถ๋ถ์ ์ฐธ์กฐ์ด๋ค. ํธ์ถ๋ถ์ ์ฐธ์กฐ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๊ฐ์ง๊ฐ ์๋ค.
์ ์ญ์์ ํจ์๋ฅผ ํธ์ถํ๊ณ ํจ์๊ฐ this๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
function foo() {
console.log(this.a);
}
var a = 'Hello World';
foo(); // Hello World
ํจ์(์ ํํ๋ ๋ฉ์๋์ด๋ค)๋ฅผ ํธ์ถํ ๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
function foo () {
console.log(this.a);
}
const obj = {
a: 2019,
foo
};
obj.foo(); // 2019
๊ฐ์ฒด ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋น ํ ํธ์ถํ๋ฉด ์์์ ์์ค์ด ๋๋ค.
const myFoo = obj.foo;
myFoo(); // undefined
ํจ์๋ฅผ ํธ์ถํ ๋ ๋ช ์์ ์ผ๋ก this๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง๋ฅผ ์ ์ํ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ this๋ก ์ฌ์ฉ๋๋ค.
function foo () {
console.log(this.a);
}
const obj = { a: 2019 };
foo.call(obj); // 2019
foo.apply(obj); // 2019
foo.bind(obj)(); // 2019
function foo () {
setTimeout(() => {
console.log(this.a); // 2019
});
}
const bar = new foo();
bar.a = 2019;
ES6๋ถํฐ๋ ์ด ๊ท์น๋ค์ ๋ฐ๋ฅด์ง ์๋ ํน๋ณํ ํจ์๊ฐ ์๋ค. ๋ฐ๋ก ํ์ดํ ํจ์๋ผ๊ณ ํ๋ฉฐ, 4๊ฐ์ง ํ์ค ๊ท์น ๋์ ์ ๋๋ฅธ ์ค์ฝํ(Enclosing Scope)๋ฅผ ๋ณด๊ณ this๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
<button>0</button>
var app = {
count: 0,
init: function () {
document.querySelector('button')
.addEventListener('click', this.upCount.bind(this))
},
upCount: function () {
this.count++
this.render()
},
render: function () {
document.querySelector('button')
.textContent = this.count
}
}
app.init()
const app = {
count: 0,
init() {
document.querySelector('button')
.addEventListener('click', () => {
this.upCount()
})
},
upCount() {
this.count++
this.render()
},
render() {
document.querySelector('button')
.textContent = this.count
}
}
app.init()