The difference between call apply bind - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค์ด๋๋ฏนํ ์ธ์ด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๊ฐ์ง ์์
์ ํ ์ ์๋ ๊ฐ๋ณ์ ์ธ ์ธ์ด์
๋๋ค. ๊ฐ์ฒด ๋๋ ํด๋์ค๊ฐ ์์๋ก๋ถํฐ ์์๋ฐ์ ์ ์๋ ์ธ์ด์ด๋ฉฐ, ์ด ์์
์ call
, apply
, bind
์ธ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ, ๋ญ๊ฐ ๋ค๋ฅธ์ง ์์๋ณผ๊น์?
Call
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ obj
๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. things๋ผ๋ key์ ๊ฐ์ด 3์ด ๋ค์ด๊ฐ์๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ๊ฐ์ ์๋ ๋ฌด๊ดํ addThings๋ผ๋ function์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
let obj = {things: 3};
let addThings = function(a, b, c){
return this.things + a + b + c;
};
์ฌ๊ธฐ์ this.things
๋ ๋ฌด์์ผ๊น์, addThings
๋ฅผ ํธ์ถํ ๋์ things๋ผ๋ ๊ฒ์ด ์๋๋ฐ ์ return๊ฐ์ ๋ฃ์์๊น์? ์ด ๊ตฌ๋ฌธ์ ์ ์ ๋์ด๊ฐ ํ์๊ฐ ์์ต๋๋ค. call
์ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ฝ๋๋ ์ฌ์ฉ๊ฐ๋ฅํ ์ฝ๋๊ฐ ๋๊ฒ ๋ฉ๋๋ค
console.log( addThings.call(obj, 1,4,6) )
return๊ฐ์ผ๋ก ์ซ์ 14๊ฐ ๋์์ต๋๋ค.
๊ทธ๋ผ ์ฒซ๋ฒ์งธ parmeter๋ฅผ call๋ก ๋ฐ์์ ๊ฒฝ์ฐ ์์ obj๋ฅผ ๋๊ฒผ์ ๋ this๋ ๋ฌด์์ ์ํด ์๋ ๊ฑธ๊น์? things ์์ฒด์ ๊ฐ์ ์ธ์๊ฐ์ผ๋ก ๋๊ฒผ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ์ ํต๊ณผํ ๊ฒ์ ๋๋ค.
return this.things + a + b + c;
์ด ๊ตฌ๋ฌธ์ ํ์ด์ฐ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
return 3 + 1 + 4 + 6
๊ทธ๋์ return ๊ฐ์ 14๊ฐ ๋ ๊ฒ ์
๋๋ค.
์ด์ call
์ ๋๋ฌ์ต๋๋ค! apply
๋ก ๋์ด๊ฐ๋ณด์ฃ
Apply
apply
๋ call
๊ณผ ๋น์ทํฉ๋๋ค.
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ฐ๋ฆฌ๊ฐ arguments๋ฅผ ํต๊ณผํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๋ฐฐ์ด๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด์ ์ฝ๋๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ์์ํ๊ฒ ์ต๋๋ค.
let obj = {things: 3};
let addThings = function(a, b, c){
return this.things + a + b + c;
};
let arr = [1,4,6];
console.log( addThings.apply(obj, arr) );
Bind
let obj = {things: 3};
let addThings = function(a, b, c){
return this.things + a + b + c;
};
console.log( addThings.bind(obj, 1,4,6) );
bind๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์งํํ๋ค๋ฉด 14๋ผ๊ณ ๋จ์ง ์์ ๊ฒ ์ ๋๋ค. bind๋ function์ ๋ณต์ฌ๋ณธ์ return ํ์ง๋ง ๋ค๋ฅธ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ์์ ์ฝ๋์์๋ obj๋ฅผ ํต๊ณผ์์ผฐ์ง๋ง ์คํํ์ง๋ ์์ต๋๋ค.
console.log( addThings.bind(obj, 1,4,6)() );
bind๋ฅผ ํตํ์ฌ obj์ this๋ฅผ ์ ๋ฌ ํด์ค ํ ๊ทธ ๋ค์ ์ธ์๋ค์ ์ ๋ฌํด๋ณด๊ฒ ์ต๋๋ค.
console.log( addThings.bind(obj)(1,4,6) );
์ด์ ์ ์ฉ์ด ๋์์ด์! ์ ์คํ์ด ๋์ฃ ?
Call / Apply / Bind์ ๋ํด ์์๋ณด๋ ์๊ฐ์ด์์ต๋๋ค!
Happy coding.