2022. 5. 7. 17:34ใjavascript
์๋ฐ์คํฌ๋ฆฝํธ - this, bind
(ํด๋น ๋ด์ฉ์ smashingmagazine ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด์ ์ ์ํ์์.)
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ตํ๋ค๋ณด๋ฉด ์๋ํ๋ context๋๋ก ์๋ํ์ง ์์ ๋๊ฐ ์๋ค. ์ด๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด์ ๊ท์น์ด ์กด์ฌํ๋ค๋ ์ฆ๊ฑฐ์ด๋ฉฐ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํ์ตํ๊ณ ์ ์ ํ๊ฒ ์ฌ์ฉํ ์ค ์์์ผ ํ๋ค.
๋จผ์ ์๋ ์ฝ๋ ์์๋ฅผ ์ดํด๋ณด์.
var myObj = {
specialFunction: function () {
},
anotherSpecialFunction: function () {
},
getAsyncData: function (cb) {
cb();
},
render: function () {
var that = this;
this.getAsyncData(function () {
that.specialFunction();
that.anotherSpecialFunction();
});
}
};
myObj.render();
๊ฒฐ๊ณผ๋ถํฐ ๋งํ์๋ฉด ์ ์ฝ๋๋ ์ ๋๋ก ๋์ํ๋ค.
ํ์ง๋ง renderํจ์์์ that.specialFunction()์ด ์๋ this.specialFunction์ ํ์ด๋ ๋์ํ์๊น?
์ ๋ต์ ์๋๋ค. renderํจ์์ ๋ค์ด์ค๋ this๋ ๊ฐ์ฒด myObj๋ฅผ ์ฐธ์กฐํ๊ณ ์์ง๋ง ๊ทธ ์์ getAsyncData๋ฅผ ํตํด์ ์๋ก์ด function (์ฝ๋ฐฑํจ์)๋ก ๋ค์ด์๊ธฐ ๋๋ฌธ์ ์ด ๊ณณ์์ context๊ฐ ๋ฐ๋๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ ์ฝ๋์์ var that = this๋ผ๋ myobj์ this๊ฐ์ ์ ์งํ ์ ์๋ ๋ณ์๋ฅผ ์ ์ํ์๊ณ ์ด ๋ณ์๋ฅผ ํตํด์ ํจ์๋ค์ ํธ์ถํ์๋ค.
์ด ๋ฐฉ๋ฒ์ด ๋์ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ฅํจ์์๋ ์ด๋ฌํ context๋ฅผ ์ด์ด๋๊ฐ ์ ์๋๋ก ์ง์ํ๋ bind()ํจ์๊ฐ ์๋ค.
bind()
bind()๋ Function ํ๋กํ ํ์ ์ ๋ด์ฅํจ์๋ก์ ์คํ๋์ ๋ ์ ๊ณต๋ value๊ฐ์ผ๋ก this๊ฐ ์ธํ ๋ ์ํ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด๋ด๋ ํจ์์ด๋ค. ์์ renderํจ์๋ฅผ bind๋ฅผ ์ฌ์ฉํด์ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
render: function () {
this.getAsyncData(function () {
this.specialFunction();
this.anotherSpecialFunction();
}.bind(this));
}
bind์ ์ธ์๋ก ๋ค์ด์จ this๋ฅผ ์ฝ๋ฐฑํจ์์ ์ ๋ฌํจ์ผ๋ก์จ this context๊ฐ ์ ์ง๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Function.prototype.bind์ ๋ด๋ถ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
Function.prototype.bind = function (scope) {
var fn = this;
return function () {
return fn.apply(scope);
};
}
์๋๋ bind๋ฅผ ์ฌ์ฉํ ๋ค๋ฅธ ์์์ด๋ค.
var foo = {
x: 3
}
var bar = function(){
console.log(this.x);
}
bar(); // undefined
var boundFunc = bar.bind(foo);
boundFunc(); // 3
์ฆ ์ฝ๋ฐฑ์์ this๊ฐ ์๋ํ๋ ค๋ฉด ๋ฐ์ธ๋ฉ์ ํด์ค์ผ ์๋ํ๋ค.
'javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ - ํด๋ก์ (0) | 2022.04.07 |
---|