ํจ์์ ์์์ ํ๋ผ๋ฏธํฐ - this #3
์์์ ํ๋ผ๋ฏธํฐ์ธ this์ ๋ํด์ ์์๋ด ๋๋ค.
Dec 4, 2021
ํจ์์ ์์์ ํ๋ผ๋ฏธํฐ๋ 4ํธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ํฌ์คํ ์์๋ ์ด์ ์ฅ์ ์ด์ด์ call ๋ฐ apply๋ฅผ ํตํ ํธ์ถ์ ์์๋ณด๊ฒ ์ต๋๋ค.
ํจ์๋ก์ ํธ์ถ๋ฉ์๋๋ก์ ํธ์ถ์์ฑ์๋ก์ ํธ์ถ- call ๋ฐ apply๋ฅผ ํตํ ํธ์ถ
ํจ์ ์ปจํ ์คํธ
์ง๊ธ๊น์ง ์ดํด๋ณธ ํจ์ ํธ์ถ ๋ฐฉ๋ฒ๋ค์ ์ฃผ์ ์ฐจ์ด์ ์ ์คํ ์ค์ธ ํจ์์ ์ ๋ฌ๋ ์์์ ํ๋ผ๋ฏธํฐ์ธ this์ ์ํด ์ฐธ์กฐ๋๋ ํจ์ ์ปจํ ์คํธ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ํจ์ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ํจ์ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ด ํ๋์ง ์๋ ์์ ๋ฅผ ํตํด ํ์ธํด ๋ด ์๋ค.
function junggle() {
const numbers = [...arguments]
const result = numbers.reduce((acc, current) => acc + current)
this.result = result
console.log(this)
}
junggle([1, 2, 3])
์ ์ฝ๋๋ ๊ธ๋ก๋ฒ ์ค์ฝํ์์ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ this๋ window ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค.
๋ง์ฝ์ ์ด juggle ํจ์์ result๋ผ๋ ์์ฑ์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ํ ๋นํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
apply, call
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ํจ์ ์ปจํ ์คํธ๋ก ์ํ๋ ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ ํจ์์ ๋ํด ์กด์ฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ธ apply ๋ฐ call ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค.
apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด apply์ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
- ํจ์ ์ปจํ ์คํธ๋ก ์ฌ์ฉํ ๊ฐ์ฒด
- ํธ์ถ ์ธ์๋ก ์ฌ์ฉํ ๊ฐ์ ๋ฐฐ์ด์ ๋๋ค.
call ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด apply์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ํจ์ ์ปจํ ์คํธ๋ก ์ฌ์ฉํ ๊ฐ์ฒด
- ํธ์ถ ์ธ์๋ก ์ฌ์ฉํ ๊ฐ์ ๋ชฉ๋ก์ ๋๋ค.
1๋ฒ์ ๋๊ฐ๊ณ 2๋ฒ์ ์ฐจ์ด์ธ๋ฐ์ ์๋ ์์ ์ฝ๋๋ก ์ดํด๋ด ์๋ค.
function junggle() {
const numbers = [...arguments]
const result = numbers.reduce((acc, current) => acc + current)
this.result = result
}
const ninja1 = {}
const ninja2 = {}
junggle.apply(ninja1, [1,2,3,4]); // ๊ฐ์ ๋ฐฐ์ด
junggle.call(ninja2, 5,6,7,8); // ๊ฐ์ ๋ชฉ๋ก
console.log(ninja1.result) // 10
console.log(ninja2.result) // 26
junggle์ด๋ผ๋ ํจ์์์ this.result์ arguments๋ค์ ํฉ์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ํจ์ ์ปจํ ์คํธ๋ก ์ฌ์ฉํ ๋ ๊ฐ์ ๊ฐ์ฒด ninja1, ninja2๋ฅผ ์ค์ ํฉ๋๋ค.
ninja1์๋ ๊ฐ ๋ฐฐ์ด์ ๋๊ธฐ๊ณ ninja2์๋ ๊ฐ ๋ชฉ๋ก์ ๋๊น๋๋ค.
ํจ์์ ์ปจํ ์คํธ์ ์ธ์๋ฅผ ์ ๊ณตํ ํ ๊ฐ์ ํ์ธํ๋ฉด ninja1, ninja2์ result๋ผ๋ ์์ฑ๊ณผ ๊ฐ์ด ์ ํ ๋น๋์์ต๋๋ค.
๊ฒฐ๊ณผ๋ jsfiddle์์ ํ์ธํด ์ฃผ์ธ์!
๋ง์น๋ฉฐ
์ด๋ฒ์ฅ์ ๋ง์ง๋ง์ผ๋ก ํจ์์ ์์์ ํ๋ผ๋ฏธํฐ์ธ arguments์ this๊ฐ ๋ง๋ฌด๋ฆฌ๋์์ต๋๋ค.
๋ค์ ํธ์๋ ์ค๋ฌด์์ ์์ฃผ ์ค์ํ๊ณ ์๊ฒ ๋ชจ๋ฅด๊ฒ ๋์ด๊ฐ๋ ์์ ํ๋๋ฅผ ์ค๋ช ํด ๋๋ฆด๋ ค๊ณ ํฉ๋๋ค.
๋ค์ ํธ๋ ๊ธฐ๋ํด ์ฃผ์ธ์.
๊ฐ์ฌํฉ๋๋ค.