๐ค ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๊ฐ ๋ฌธ๋งฅ์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํ ์๋ ์์๊น?
๐ค ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์ ๋ค๋ฅธ ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ
<์ ํต์ ๋ฐฉ์>
์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๊ฐ์ ๋ก this๋ฅผ ์ ์ดํ๋ ๋ฐฉ๋ฒ์์ ์ด์ง ๋ค๋ค๋ ๋ฐฉ์์ด์์ ๐
var obj1 = {
name: 'obj1',
func: function() {
var self = this; //์ด ๋ถ๋ถ!
return function () {
console.log(self.name);
};
}
};
// ๋จ์ํ ํจ์๋ง ์ ๋ฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, obj1 ๊ฐ์ฒด์๋ ์๊ด์ด ์์ด์.
// ๋ฉ์๋๊ฐ ์๋ ํจ์๋ก์ ํธ์ถํ ๊ฒ๊ณผ ๋์ผํ์ฃ .
var callback = obj1.func();
setTimeout(callback, 1000);
์ค์ ๋ก๋ this๋ฅผ ์ฌ์ฉํ๋๊ฒ ์๋๊ธฐ๋ ํ๊ณ , ๋ฒ๊ฑฐ๋กญ๋ค์.
๊ทธ๋ ๋ค๋ฉด, ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ ์์ this๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ด๋จ๊น์?
var obj1 = {
name: 'obj1',
func: function () {
console.log(obj1.name);
}
};
setTimeout(obj1.func, 1000);
์ฒซ ๋ฒ์งธ ์์๋ณด๋ค๋ ํจ์ฌ ๊ฐ๊ฒฐํ๊ธด ํด์. ํ์ง๋ง this๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด์ **๊ฒฐ๊ณผ๋ง์ ์ํ ์ฝ๋ฉ**์ด ๋์ด๋ฒ๋ ธ๋ค์. this๋ฅผ ์ด์ฉํด์ ๋ค์ํ ๊ฒ์ ํ ์ ์๋ ์ฅ์ ์ ๋์น๊ฒ ๋จ
์คํ๋ ค, ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฌํ์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ์ ํํด๋ณผ๊น?
์ฝ๋๊ฐ ํท๊ฐ๋ฆด ์ ์์ผ๋, VSCode ์์์ ์ง์ function์ ๋์ ํด๋ณด๋ฉด์ ์์๋ฅผ ๋ฐ๋ผ๊ฐ์๊ธฐ ๋ฐ๋์!
var obj1 = {
name: 'obj1',
func: function() {
var self = this; //์ด ๋ถ๋ถ!
return function () {
console.log(self.name);
};
}
};
// ---------------------------------
// obj1์ func๋ฅผ ์ง์ ์๋์ ๋์
ํด๋ณด๋ฉด ์กฐ๊ธ ๋ ๋ณด๊ธฐ ์ฝ์ต๋๋ค!
var obj2 = {
name: 'obj2',
func: obj1.func
};
var callback2 = obj2.func();
setTimeout(callback2, 1500);
// ์ญ์, obj1์ func๋ฅผ ์ง์ ์๋์ ๋์
ํด๋ณด๋ฉด ์กฐ๊ธ ๋ ๋ณด๊ธฐ ์ฝ์ต๋๋ค!
var obj3 = { name: 'obj3' };
var callback3 = obj1.func.call(obj3);
setTimeout(callback3, 2000);
์ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ฒ๊ฑฐ๋กญ๊ธด ํด๋ this๋ฅผ ์ฐํ์ ์ผ๋ก๋๋ง ํ์ฉํ์ฌ ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํ ์ ์์์ด์!
์ง๊ธ๊น์ง ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ ๋ชจ์ต์ ๋ณด์ฌ๋๋ ธ์ด์. ํ์ง๋ง ์ด์ ๋ ์ด๋ฌํ ๋ถ๋ถ์ ์์ฃผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋๋ฐ์. ๋ฐ๋ก **bind ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ**์ด์์.
<๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ → bind๋ฉ์๋์ ํ์ฉ>
var obj1 = {
name: 'obj1',
func: function () {
console.log(this.name);
}
};
//ํจ์ ์์ฒด๋ฅผ obj1์ ๋ฐ์ธ๋ฉ
//obj1.func๋ฅผ ์คํํ ๋ ๋ฌด์กฐ๊ฑด this๋ obj1๋ก ๊ณ ์ ํด์ค!
setTimeout(obj1.func.bind(obj1), 1000);
var obj2 = { name: 'obj2' };
//ํจ์ ์์ฒด๋ฅผ obj2์ ๋ฐ์ธ๋ฉ
//obj1.func๋ฅผ ์คํํ ๋ ๋ฌด์กฐ๊ฑด this๋ obj2๋ก ๊ณ ์ ํด์ค!
setTimeout(obj1.func.bind(obj2), 1500);
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฝ๋ฐฑํจ์_promise (1) | 2023.12.18 |
---|---|
์ฝ๋ฐฑ์ง์ฅ & ๋๊ธฐ ๋น๋๊ธฐ (0) | 2023.12.18 |
์ฝ๋ฐฑ ํจ์๋ ํจ์๋ค (0) | 2023.12.18 |
์ฝ๋ฐฑํจ์_this ๋ฐ์ธ๋ฉ (0) | 2023.12.18 |
์ฝ๋ฐฑํจ์_์ธ์ & this ๋ฐ์ธ๋ฉ (0) | 2023.12.18 |