JavaScript - this(2)
์๋ฐ์คํฌ๋ฆฝํธ - this(2)
๋ช ์์ ์ผ๋ก this๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ
call ๋ฉ์๋
Function.prototype.call(thisArg[,arg1[,arg2,...]]])
- ๋ฉ์๋์ ํธ์ถ ์ฃผ์ฒด์ธ ํจ์๋ฅผ ์ฆ์ ์คํํ๋๋ก ํ๋ ๋ช ๋ น
- ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ this๋ก ๋ฐ์ธ๋ฉํ๊ณ , ์ดํ์ ์ธ์๋ค์ ํธ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ํจ
- call ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์์์ ๊ฐ์ฒด๋ฅผ this๋ก ์ง์ ๊ฐ๋ฅ
apply ๋ฉ์๋
Function.prototype.aplly(thisArg[,argsArray])
- call ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ผ๋ก ์์ ํ ๋์ผ
- ๋ ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ๊ทธ ๋ฐฐ์ด์ ์์๋ค์ ํธ์ถํ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์
call / apply ๋ฉ์๋์ ํ์ฉ
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ ์ฉ
- ๊ฐ์ฒด์๋ ๋ฐฐ์ด ๋ฉ์๋ ์ง์ ์ ์ฉ โ
- ๋จ, ํค๊ฐ 0 ๋๋ ์์ ์ ์์ธ ํ๋กํฐํผ๊ฐ ์กด์ฌํ๊ณ length ํ๋กํผํฐ์ ๊ฐ์ด 0 ๋๋ ์์ ์ ์์ธ ๊ฐ์ฒด
- ๋ฐฐ์ด์ ๊ตฌ์กฐ์ ์ ์ฌํ ๊ฐ์ฒด์ ๊ฒฝ์ฐ(์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด) call ๋๋ apply ๋ฉ์๋ ์ด์ฉํด ๋ฐฐ์ด ๋ฉ์๋ ์ฐจ์ฉ ๊ฐ๋ฅ
push
๋ฅผ ๊ฐ์ฒด obj์ ์ ์ฉํด ํ๋กํผํฐ 3์ โdโ ์ถ๊ฐcall
๋ฉ์๋๋ฅผ ์ด์ฉํด ์๋ณธ์ธ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด์ ์์ ๋ณต์ฌ ์ํslice
๋ฉ์๋๋ฅผ ์ ์ฉํด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ์ ํ- ๋ฐฐ์ด๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ณธ์ ๋ฐฐ์ด๋ก ๋ฐํ
- ๋ฌธ์์ด์ ๊ฒฝ์ฐ length ํ๋กํผํฐ๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์ ์๋ณธ ๋ฌธ์์ด์ ๋ณ๊ฒฝ์ ๊ฐํ๋ ๋ฉ์๋(push,pop,shift,unshift,splice ๋ฑ)์๋ error๋ฅผ ๋์ง
- concat์ฒ๋ผ ๋์์ด ๋ฐ๋์ ๋ฐฐ์ด์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋ฌ๋ ๋์ง ์์ง๋ง, ์ ๋๋ก ๋ ๊ฒฐ๊ณผ โ
- ES6์์๋ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด ๋๋ ์ํ ๊ฐ๋ฅํ ๋ชจ๋ ์ข ๋ฅ์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐฐ์ด๋ก ์ ํํ๋ Array.from ๋ฉ์๋ ๋์
์์ฑ์ ๋ด๋ถ์์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถ
- ์์ฑ์ ๋ด๋ถ์ ๋ค๋ฅธ ์์ฑ์์ ๊ณตํต๋ ๋ด์ฉ์ด ์์ ๊ฒฝ์ฐ
- call or apply๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ์์ฑ์ฌ๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋จํ๊ฒ ๋ฐ๋ณต์ ์ค์ผ ์ ์์
์ฌ๋ฌ ์ธ์๋ฅผ ๋ฌถ์ด ํ๋์ ๋ฐฐ์ด๋ก ์ ๋ฌํ๊ณ ์ถ์ ๋ - apply ํ์ฉ
- ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ๋ฉ์๋์๊ฒ ํ๋์ ๋ฐฐ์ด๋ก ์ธ์๋ค์ ์ ๋ฌํ๊ณ ์ถ์ ๋ ํ์ฉ
- ES6์์๋ spread operator๋ฅผ ์ด์ฉํ๋ฉด apply๋ณด๋ค ๋์ฑ ๊ฐํธํ๊ฒ ์์ฑ ๊ฐ๋ฅ
bind ๋ฉ์๋
Function.prototype.bind(thisArg[, arg1[,arg2[, ...]]])
- ES5์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ
- call๊ณผ ๋น์ทํ์ง๋ง ์ฆ์ ํธ์ถํ์ง ์๊ณ , ๋๊ฒจ ๋ฐ์ this ๋ฐ ์ธ์๋ค์ ๋ฐํ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ ๋ฉ์๋
- ํจ์์ this๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉํ๋ ๊ฒ๊ณผ ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ง ๋ชฉ์ ์ ์ง๋
name ํ๋กํผํฐ
- bind ๋ฉ์๋๋ฅผ ์ ์ฉํด์ ์๋ก ๋ง๋ ํจ์๋ ํ ๊ฐ์ง ๋
์ฐฉํ ์ฑ์ง์ด ์์
- name ํ๋กํผํฐ์ ๋์ฌ bind์ ์๋ํ์ธ โboundโ๋ผ๋ ์ ๋์ด๊ฐ ๋ถ๋๋ค๋ ์
- ์ด๋ค ํจ์์ name ํ๋กํผํฐ๊ฐ โbound xxxโ๋ผ๋ฉด ์ด๋ ๊ณง ํจ์๋ช ์ด xxx์ธ ์๋ณธ ํจ์์ bind ๋ฉ์๋๊ฐ ์ ์ฉํ ์๋ก์ด ํจ์๋ผ๋ ์๋ฏธ
- ๊ธฐ์กด์ call or apply๋ณด๋ค ์ฝ๋ ์ถ์ ์ด ์์ํจ
์์ ์ปจํ ์คํธ์ this๋ฅผ ๋ด๋ถํจ์๋ ์ฝ๋ฐฑ ํจ์์ ์ ๋ฌํ๊ธฐ
-
call or apply or bind ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋์ ๋ด๋ถํจ์์์ ๋ฉ์๋์ this๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผ๋ณด๊ฒ ํ๊ธฐ ๊ฐ๋ฅ
-
๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋ฐฑ ํจ์ ๋ด์์์ this์ ๊ด์ฌํ๋ ํจ์ ๋๋ ๋ฉ์๋์ ๋ํด์๋ bind ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด this๊ฐ์ ์ฌ์ฉ์์ ์ ๋ง์ ๋ง๊ฒ ์์ ๊ฐ๋ฅ
ํ์ดํ ํจ์์ ์์ธ์ฌํญ
- ES6์ ์๋กญ๊ฒ ๋์ ๋ ํ์ดํ ํจ์๋ ์คํ ์ปจํ ์คํธ ์์ฑ ์, this๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ โ
- ํจ์ ๋ด๋ถ์ this๊ฐ ์์ ์์ผ๋ฉฐ, ์ ๊ทผํ๊ณ ์ ํ๋ฉด ์ค์ฝํ์ฒด์ธ์ ๊ฐ์ฅ ๊ฐ๊น์ด this์ ์ ๊ทผ
- ๋ณ๋์ ๋ณ์๋ก this๋ฅผ ์ฐํํ ํ์ โ
- call/apply/bind ์ ์ฉํ ํ์ โ , ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ํธ๋ฆฌ
๋ณ๋์ ์ธ์๋ก this๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ(์ฝ๋ฐฑ ํจ์ ๋ด์์์ this)
- ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋ ์ค ์ผ๋ถ๋ ์ถ๊ฐ๋ก this๋ก ์ง์ ํ ๊ฐ์ฒด(thisArg)๋ฅผ ์ธ์๋ก ์ง์ ํ ์ ์๋ ๊ฒฝ์ฐ โญ๏ธ
- ์ด๋ฌํ ๋ฉ์๋์ thisArg ๊ฐ์ ์ง์ ํ๋ฉด ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this ๊ฐ์ ์ํ๋ ๋๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ๋ฐฐ์ด ๋ฉ์๋์ ๋ง์ด ํฌ์ง
- ES6์ ์๋ก ๋ฑ์ฅํ set,map ๋ฑ์ ๋ฉ์๋์๋ ์ผ๋ถ ์กด์ฌ / ๊ทธ ์ค ๋ํ์ ์ธ ๋ฐฐ์ด ๋ฉ์๋์ธ forEach
์ฝ๋ฐฑํจ์์ ํจ๊ป thisArg๋ฅผ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋
Array.prototype.forEach(callback[,thisArg])
Array.prototype.map(callback[,thisArg])
Array.prototype.filter(callback[,thisArg])
Array.prototype.some(callback[,thisArg])
Array.prototype.every(callback[,thisArg])
Array.prototype.find(callback[,thisArg])
Array.prototype.findIndex(callback[,thisArg])
Array.prototype.flatMap(callback[,thisArg])
Array.prototype.from(arrayLike[,(callback[,thisArg]])
set.prototype.forEach(callback[,thisArg])
Map.prototype.forEach(callback[,thisArg])
์ฐธ๊ณ : ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ(Core JavaScript), ์ ์ฌ๋จ