์ฝ๋ฐฑ ํจ์๋ ํจ์๋ค
์์ - ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌ
const obj = {
vals: [1, 2, 3],
logValues: function (v, i) {
console.log(this, v, i);
}
};
obj.logValues(1, 2);
[4, 5, 6].forEach(obj.logValues);
- ์ด๋ค ํจ์์ ์ธ์์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ ๋ฌํ๋๋ผ๋ ์ด๋ ๊ฒฐ๊ตญ ๋ฉ์๋๊ฐ ์๋ ํจ์ ์ผ ๋ฟ
์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์ ๋ค๋ฅธ ๊ฐ ๋ฐ์ธ๋ฉํ๊ธฐ
- ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌํ๋ฉด ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์๋๋ผ ํจ์๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ฒด๋ฅผ this๋ก ๋ฐ๋ผ๋ณผ ์ ์๊ฒ ๋จ
์์ - ์ ํต์ ์ธ ๋ฐฉ์
const obj1 = {
name: 'obj1',
func: function () {
const self = this;
return function () {
console.log(self.name);
}
}
};
const callback = obj1.func();
setTimeout(callback, 1000);
- ๋ฉ์๋ ๋ด๋ถ์์ self ๋ณ์์ this๋ฅผ ๋ด์์ ์ฌ์ฉ
- ์ค์ ๋ก this๋ฅผ ์ฌ์ฉํ์ง๋ ์์๋ฟ๋๋ฌ ๋ฒ๊ฑฐ๋ก์
์์ - this๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
const obj1 = {
name: 'obj1',
func: function () {
console.log(obj1.name);
}
};
setTimeout(obj1.func, 1000);
- ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ด์ง๋ง ์์ฌ์ด ๋ถ๋ถ๋ ์์
- this๋ฅผ ์ด์ฉํด ๋ค์ํ ์ํฉ์ ์ฌํ์ฉํ ์ ์๊ฒ ๋จ
์์ - func ํจ์ ์ฌํ์ฉ
const obj1 = {
name: 'obj1',
func: function () {
const self = this;
return function () {
console.log(self.name);
}
}
};
const callback = obj1.func();
setTimeout(callback, 1000);
const obj2 = {
name: 'obj2',
func: obj1.func
};
const callback2 = obj2.func();
setTimeout(callback2, 1500);
const obj3 = { name: 'obj3' };
const callback3 = obj1.func.call(obj3);
setTimeout(callback3, 2000);
- ์์ ์์ ์ฒ๋ผ this๋ฅผ ์ฐํ์ ์ผ๋ก ํ์ฉํ ๊ฒฝ์ฐ์๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅ
- ํ์ง๋ง this๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๊ฐ์ฒด ์ด๋ฆ์ ์ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
์์ - bind ๋ฉ์๋ ํ์ฉ
const obj1 = {
name: 'obj1',
func: function () {
console.log(this.name);
}
};
setTimeout(obj1.func.bind(obj1), 1000);
const obj2 = { name: 'obj2' };
setTimeout(obj1.func.bind(obj2), 1500);
- ES5์ ์ถ๊ฐ ๋ bind ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค๋ฉด ๊น๋ํ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅ