๋ชฉ์ฐจ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ธ๋ฉ: ํ์ฉ๊ณผ ์ฃผ์์
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ธ๋ฉ(binding)์ด๋, ํน์ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ this
์ ๊ฐ์ ๊ณ ์ ํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ด๋ this
๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๊ฐ ์คํ ์ปจํ
์คํธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ ๋๋ฌธ์ ์ค์ํฉ๋๋ค. this
์ ๋์ ์ธ ํน์ฑ์ ์ ์ฉํ ๋๋ ์์ง๋ง, ์๊ธฐ์น ์์ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๊ธฐ์ ๋ฐ์ธ๋ฉ์ ํตํด ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ธ๋ฉ์ ํ์์ฑ
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ this
๊ฐ์ด ๊ฒฐ์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฉ์๋๋ก ํธ์ถ๋ ๋๋ this
๊ฐ ๊ทธ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง, ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ๋๋ this
๊ฐ ์ ์ญ ๊ฐ์ฒด(๋ธ๋ผ์ฐ์ ์์๋ window
, Node.js์์๋ global
)๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋ undefined
(์๊ฒฉ ๋ชจ๋์์)๊ฐ ๋ ์ ์์ต๋๋ค.
์ด๋ฐ ํน์ฑ ๋๋ฌธ์, ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๊ฐ์ ๊ณณ์์ ์ํ์ง ์๋ this
๋ฐ์ธ๋ฉ์ด ๋ฐ์ํ๊ณค ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ ๋ ์ข
์ข
๋ฐ์ํ๋๋ฐ, ์ด๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด this
๊ฐ ์์์น ๋ชปํ ๊ฐ์ ๊ฐ๋ฆฌํค๊ฒ ๋ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ธ๋ฉ ๋ฐฉ๋ฒ๋ค
Function.prototype.bind()
bind()
๋ฉ์๋๋this
๋ฅผ ํน์ ๊ฐ์ ๊ณ ์ ์ํค๋ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์this
๊ฐ ๋์ ์ผ๋ก ๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ํญ์ ์ง์ ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ ์ ์์ต๋๋ค.- ํ์ดํ ํจ์
ES6๋ถํฐ ์ถ๊ฐ๋ ํ์ดํ ํจ์๋this
๋ฅผ ๋ฐ์ธ๋ฉํ์ง ์์ต๋๋ค. ๋์ , ํ์ดํ ํจ์๊ฐ ์ ์ธ๋ ์์ ์this
๊ฐ์ "์ดํ์ ์ผ๋ก" ๋ฐ์ธ๋ฉํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ํด๋์ค์ ๋ฉ์๋์์ ์ฝ๋ฐฑ์ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. - ํด๋ก์ ๋ฅผ ํ์ฉํ ๋ฐ์ธ๋ฉ
ํจ์๋ฅผ ๋ฐํํ๋ ํจ์(๋๋ ํด๋ก์ )๋ฅผ ์ด์ฉํ์ฌthis
๋ฅผ ์ํ๋ ๊ฐ์ ๊ณ ์ ํ ์๋ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์bind()
๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํฉ์์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์์
bind()
๋ฉ์๋๋ ์๋ก์ด ํจ์๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ํฉ์์๋ ๊ณผ๋ํ ์ฌ์ฉ์ ํผํด์ผ ํฉ๋๋ค.- ํ์ดํ ํจ์๋
this
์ธ์๋arguments
,super
,new.target
์ ๋ฐ์ธ๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํ์๋ก ํ๋ ์ํฉ์์๋ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. - ํด๋ก์ ๋ฅผ ์ด์ฉํ ๋ฐ์ธ๋ฉ์ ์ฝ๋์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์์ผ๋ฏ๋ก, ๋ช ํํ ์ดํด ์์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ธ๋ฉ ์ค์ ํ์ฉ ์ฌ๋ก
์ฝ๋ ์์ ๋ฅผ ํตํด ๋ฐ์ธ๋ฉ์ ํ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
bind()
ํ์ฉ ์์ ์ ์ฝ๋์์setTimeout
๋ด๋ถ์์person.greet
๋ฅผ ํธ์ถํ ๋this
๋ฅผperson
๊ฐ์ฒด์ ๊ณ ์ ์ํค๊ธฐ ์ํดbind()
๋ฅผ ์ฌ์ฉํ์ต๋๋ค.const person = { name: 'ํ๊ธธ๋', greet: function() { console.log(`์๋ ํ์ธ์, ${this.name}์ ๋๋ค.`); } }; setTimeout(person.greet.bind(person), 1000);
- ํ์ดํ ํจ์ ํ์ฉ ์์ ํด๋์ค์
greet
๋ฉ์๋๋ฅผ ํ์ดํ ํจ์๋ก ์ ์ธํจ์ผ๋ก์จ, ์ด๋์๋this.name
์ดperson
์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณด์ฅํฉ๋๋ค. class Person { constructor(name) { this.name = name; } greet = () => { console.log(`์๋ ํ์ธ์, ${this.name}์ ๋๋ค.`); } } const person = new Person('ํ๊ธธ๋'); setTimeout(person.greet, 1000);
- ํด๋ก์ ํ์ฉ ์์
makeGreet
ํจ์๋ ํด๋ก์ ๋ฅผ ๋ฐํํ๊ณ , ์ด ํด๋ก์ ๋name
๋ณ์๋ฅผ ๊ธฐ์ตํฉ๋๋ค.setTimeout
์์ ์ฌ์ฉ๋๋greet
ํจ์๋this
์ ์์กดํ์ง ์๊ณ ์๋ํฉ๋๋ค. function makeGreet(name) { return function() { console.log(`์๋ ํ์ธ์, ${name}์ ๋๋ค.`); } } const greet = makeGreet('ํ๊ธธ๋'); setTimeout(greet, 1000);
์๋ฐ์คํฌ๋ฆฝํธ์์ this
๋ฐ์ธ๋ฉ์ ๋๋ก ๋ณต์กํ๊ณ ํผ๋์ค๋ฌ์ธ ์ ์์ง๋ง, ๋ฐ์ธ๋ฉ์ ๊ฐ๋
๊ณผ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฉํ๋ค๋ฉด ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํญ์ ๋ฐ์ธ๋ฉ์ ๋ชฉ์ ๊ณผ ์ํฉ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
ํค์๋: ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ธ๋ฉ, this
, bind()
๋ฉ์๋, ํ์ดํ ํจ์, ํด๋ก์ , ์ฝ๋ฐฑ ํจ์, ์ด๋ฒคํธ ํธ๋ค๋ฌ, ์คํ ์ปจํ
์คํธ, ์ดํ์ ๋ฐ์ธ๋ฉ, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ, ES6
๋๊ธ