bind() ํจ์๋ ์๋กญ๊ฒ ๋ฐ์ธ๋ฉํ ํจ์๋ฅผ ๋ง๋๋ ํจ์๋ก, ๋ฐ์ธ๋ฉํ ํจ์๋ ์๋ณธ ํจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ํจ์๋ก์จ, ๋ฐ์ธ๋ฉํ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ํ๋ ํจ์๊ฐ ํธ์ถ ๋๋ค. (ECMAScript 2015์ exotic function object)
// ์ฌ์ฉ๋ฒ
Function.bind(thisArg, [arg1, arg2, ...])
์ด๋ ์ฒซ ๋ฒ์งธ ์ธ์์ธ thisArg๋ ์ ํ์ต์ ์ผ๋ก ๊ฐ์ ์ ๋ฌํ์ง ์์๋ ๋๋ฉฐ null ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ ๋ค์์ ํจ์์ ์ ๋ฌ ํ ์ธ์ ๊ฐ์ผ๋ก ๋ฐฐ์ด ํ์ ์ผ๋ก ์ ๋ฌํ๊ฒ ๋๋ค. ์ด์ฒ๋ผ ์ธ์ ๊ฐ์ ๋ฐฐ์ด๋ก ์ ๋ฌํ๋ ๊ฒ์ apply()์ ๋น์ทํ๋ค.
[์๊ฐํ ์ ] call(), apply()์์ ์ฐจ์ด์ ์?
๊ฑฐ์ ๋์ผํ๊ฒ ํ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ํจ์๋ฅผ ์คํํ์ง ์๊ณ ํจ์๋ฅผ ์์ฑํ ํ ๋ฐํํ๋ ์ ์์ call(), apply()์์ ์ฐจ์ด์ ์ด๋ค.
// ์๋ฐ์คํฌ๋ฆฝํธ bind() ์์
mySite = {
name: 'webisfree',
getSite: function() {
return this.name;
}
}
getSite ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ํธ์ถ ํ๋ฉด ์คํํ๋ฉด ์๋์ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
mySite.getSite();
// ์ถ๋ ฅ๊ฒฐ๊ณผ
"webisfree"
๋ค์์ผ๋ก getYourSite๋ผ๋ ๋ณ์๋ฅผ ํ๋ ๋ง๋ค๊ณ ์ฌ๊ธฐ์ mySite.getSite ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค.
getYourSite = mySite.getSite;
getYourSite();
// ์ถ๋ ฅ๊ฒฐ๊ณผ
undefined
์คํํด๋ณด๋ ๊ฒฐ๊ณผ๋ undefined๊ฐ ๋ํ๋๊ฒ ๋๋ค. ์ฆ ํจ์์ this์๋ name์ด๋ผ๋ ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก window ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ bind()๋ฅผ ์ฌ์ฉํ์ฌ this ํค์๋๊ฐ mySite๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ ํ ๋ค์ ์คํํด๋ณธ๋ค.
getMySite = getYourSite.bind(mySite);
getMySite();
// ์ถ๋ ฅ๊ฒฐ๊ณผ
'webisfree'
์ด๋ฒ์๋ this๋ฅผ mySite๋ก ๊ฐ๋ฆฌํค๋๋ก bind()๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ 'webisfree'๋ฅผ ์ถ๋ ฅํ๋ค. ์ด์ ๊ฐ์ด bind()๋ฅผ ์ฌ์ฉํ๋ฉด this๊ฐ ์ด๋ค ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํฌ ๊ฒ์ธ์ง ์ ํํ ์ ์๋ค.
var obj = {
name: 'shpark'
};
function bindTest() {
console.log(this.name);
}
bindTest(); // undefined ์ถ๋ ฅ
var bindTest2 = bindTest.bind(obj); // bindTest ํจ์์ obj ๊ฐ์ฒด๋ฅผ bind
bindTest2(); // obj์ name ๊ฐ์ธ shpark ์ด ํ์ถ
์ถ์ฒ : https://shplab.tistory.com/entry/Javascript-bind-%ED%95%A8%EC%88%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0 - ๋ฐ์ํฌ์ฐ๊ตฌ์