โ ์ฃผ์: Node ์์์ this ๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ์ด ๊ธ์์ ๋ค๋ฃจ๋ ๋ด์ฉ์ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ JS ์์์ this ์ ๋๋ค.
Javascript ์ this ๋ ์์ฃผ ๋ฑ์ฅํ์ง๋ง, ์ ํํ ์๊ธฐ ํ๋ ๊ฐ๋ ์ด๋ค. ์ด๋ฒ ๊ธ์์๋ this ์ ๊ธฐ์ด ์๋ ๋ฐฉ์๊ณผ ๋ฐ์ธ๋ฉ์ ๋ํด ์ค๋ช ํ๊ณ ์ ํ๋ค. this ์ ๊ฐ๋ ์ ์ ๊ทผํ๊ธฐ ์ , ๋จผ์ ์์๋์ด์ผ ํ๋ ์คํ ์ปจํ ์คํธ์ ํ๋กํผํฐ & ๋ฉ์๋๋ถํฐ ์ดํด๋ณด์.
โจ Javascript ์์์ ์คํ ์ปจํ ์คํธ
์ด์ ๊ธ์์ ์ ๊น ์ธ๊ธํ์ง๋ง, Javascript ๋ ์ปดํ์ผ ์ธ์ด๊ฐ ์๋ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ด๋ค.
์ธํฐํ๋ฆฌํฐ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ ์คํ ์ฆ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฝ๋๋ฅผ ํ์ค์ฉ ์ฝ์ด๋ด๋ ค๊ฐ๋ฉฐ ์คํํ๋ค.
์ด ๋ ์ธํฐํ๋ฆฌํฐ๋ ์ฝ๋ ํด์์ ์กฐ๊ธ์ด๋ผ๋ ํธํ๊ฒ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋๋๋ฐ, ์ด ๋ ๋๋ ์กฐ๊ฐ๋ค์ด "์คํ ์ปจํ ์คํธ" (Execution Context) ์ด๋ค.
๐ ์คํ ์ปจํ ์คํธ๋ ๊ทธ๋์ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ์ scope, hoisting, closure ๋ฑ์ ๋ด๊ณ ์๋ ํต์ฌ ์๋ฆฌ์ด๋ฉฐ,
"์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ" ์ผ๋ก ์ ์ํ ์ ์๋ค.
โจ ํ๋กํผํฐ์ ๋ฉ์๋
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ช ๋ นํ, ํจ์ํ, ํ๋กํ ํ์ ๊ธฐ๋ฐ, ๊ฐ์ฒด๋นํฅ ํ๋ก๊ทธ๋๋ฐ (OOP) ์ ์ง์ํ๋ ๋ฉํฐ ํจ๋ฌ๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค. ์ค์ํ ๊ฒ์, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฉฐ, ์์ ํ์ ์ ์ ์ธํ ๋๋จธ์ง ๊ฐ๋ค์ ๋ชจ๋ ๊ฐ์ฒด์ด๋ค.
์์ ํ์ ์ ์ ์ธํ ๋๋จธ์ง ๊ฐ
- ํจ์
- ๋ฐฐ์ด
- ์ ๊ท ํํ์
- Etc...
๊ฐ์ฒด๋ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
const student = {
age: 10,
addTen: () => {
return student.age + 10;
}
};
student.addTen() // 20
๐ ์ฌ๊ธฐ์ student ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฌด์์ธ๊ฐ?
ํ๋กํผํฐ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ์ด๋, age ์ด๋ค.
๐ ๊ทธ๋ ๋ค๋ฉด student ๊ฐ์ฒด์ ๋ฉ์๋๋ ๋ฌด์์ธ๊ฐ?
๋ฉ์๋๋ ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์กฐ์ํ๋ ๋์์ด๋, addTen() ์ด๋ค.
์ด๋ ๋ฏ ๋ฉ์๋๊ฐ ์์ ์ด ์ํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์ (์ฐ์ ์ ๋ณ์๋ช ์ด๋ผ๊ณ ์ดํดํ๋ฉด ์ฝ๋ค) ๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ๋ฉ์๋๊ฐ ์์ ์ด ์ฐธ์กฐํด์ผ ํ๋ ์๋ณ์๋ฅผ ๋ฐ๋ก ์ ์ ์์๊น?
๋ต์ "No" ์ด๋ค. ์ฌ๊ธฐ์, this ์ ํ์์ฑ์ด ๋๋ฌ๋๊ธฐ ์์ํ๋ค.
โจ this ๊ฐ ํ์ํ ์ด์
๐ ์์ ์์๊ฐ ์ธํฐํ๋ฆฌํฐ์์ ํด์๋๋ ๋จ๊ณ๋ฅผ ์ฐ์ ์์๋ณด์.
1. ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฝ๋๋ฅผ ์ฝ์ด ๋ด๋ ค๊ฐ๋ ์๊ฐ, ๊ฐ์ฒด๊ฐ ๋จผ์ ํ๊ฐ๋๋ค.
2. ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ๊ฐ๊ฐ ์๋ฃ๋๋ฉด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด, student ์ ํ ๋น๋๋ค.
3. ๊ทธ ์ดํ์ student.addTen() ๋ฉ์๋๊ฐ ์คํ๋๋ฏ๋ก, ์ด๋ฏธ ์์ฑ๋ student.age ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด this ๋ ์ ํ์ํ ๊น? ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ๋กํผํฐ ์์ฑ์ด ๋จผ์ ์ด๋ฃจ์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ๋ น, ์์ฑ์ ํจ์ (Constructor Function) ์ ์ผ๋ฐ ๊ฐ์ฒด์๋ ์กฐ๊ธ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ๊ฐ๋๋ค.
์์ฑ์ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก :
- ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค๊ธฐ ์ํด ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํด๋์ค์ด๋ฉฐ,
- new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ๋น๋ก์ ์ธ์คํด์ค๊ฐ '์์ฑ'์ด ๋๋ค.
(์์ฑ์ ํจ์์ ๋ ์์๋ณด๋ ค๋ฉด ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๋ค)
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๋ ์์ ์์๋, ์์ง new ์ฐ์ฐ์๋ฅผ ํตํด ์ธ์คํด์ค ์๋ณ์์ ํ ๋นํ๊ธฐ ์ ์ด๋ฏ๋ก, ์์ฑ์ ํจ์ ๋ด์ ๊ฐ์ด ์ฐธ์กฐํ ์๋ณ์๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๊ฒ ๋๋ค.
function User(name) {
?.name = name;
?.isAdmin = false;
}
User ๋ผ๋ ์์ฑ์ ํจ์๋ฅผ ๋ง๋ค์ด name ๊ณผ isAdmin ์ด๋ผ๋ ํ๋กํผํฐ๋ฅผ ์ง์ ํ๊ณ ์ ํ๋๋ฐ, ํด๋น ํ๋กํผํฐ๋ User ์ ํ๋กํผํฐ๊ฐ ์๋๋ผ ํฅํ ์์ฑ๋ ์ธ์คํด์ค์ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ User.name ์ผ๋ก ์ง์ ํ ์๋ ์๋ค. ์ด๋ฌํ ์ํฉ์ ์ํด, ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ (๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ฐธ์กฐํ๋) ์๋ณ์๊ฐ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํน์ํ Javascript ์๋ณ์๊ฐ ๋ฐ๋ก this ์ด๋ฉฐ, ์์ ์ธ๊ธํ ์ญํ ๋๋ฌธ์ this ๋ฅผ ์๊ธฐ ์ฐธ์กฐ (self-referencing) ๋ณ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function User(name) {
this.name = name;
this.isAdmin = false;
}
let vodka = new User(haeun);
console.log(vodka.name) // haeun
let beer = new User(kang);
console.log(beer.name) // kang
๐ ์์ ์ฝ๋๊ฐ ํด์๋๋ ๋จ๊ณ๋ฅผ ์ดํด๋ณด๋ฉด,
1. User ์์ฑ์ ํจ์๊ฐ ๋จผ์ ์ ์๋๋ค. (this ๋ฅผ ํตํด ํฅํ ์ถ๊ฐ๋ ์ธ์คํด์ค ์ฐธ์กฐ)
2. new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก ์ธ์คํด์ค ์์ฑ, vodka ์๋ณ์์ ํ ๋น๋๋ค.
3. vodka ์๋ name, isAdmin ํ๋กํผํฐ๊ฐ ๋ด๊ธด ๊ฐ์ฒด๊ฐ ํ ๋น๋์๋ค.
4. beer ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ๊ณผ์ ๋ 1~3๊ณผ ์ ์ฌํ๋ค.
์ค์ํ ์ ์, this ์๋ณ์ ๋๋ถ์ ์์ฑ์ ํจ์๊ฐ ์์ฑ๋๋ ์๊ฐ ๋ฐ๋ก ์ฐธ์กฐํ ์๋ณ์๋ฅผ ํ์ธํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ด๋ค.
โจ This ์ ์ฃผ์ ํน์ง
๐this ๋ ๋ ํนํ ํน์ง ๋ช ๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
1. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋๋ค.
2. ํจ์ ํธ์ถ ์ arguments ๊ฐ ์๋ฌต์ ์ผ๋ก ํจ์ ๋ด๋ถ์ ์ ๋ฌ๋๋ฏ, this ๋ ์๋ฌต์ ์ผ๋ก ์ ๋ฌ๋๋ค. (์ง์ญ ๋ณ์์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ)
3. ์ฝ๋ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค.
4. this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์ & ์์ ์ ์ํด ๊ฒฐ์ ๋๋ค.
1 & 2 ๋ฒ ํน์ง์ ๊ทธ ์์ฒด๋ก ์ค๋ช ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ถ์ฐ์ ํ ํ์๊ฐ ์์ผ๋,
3 & 4 ๋ฒ ํน์ง์ ํผ๋์ ์ฌ์ง๊ฐ ์์ด ์กฐ๊ธ ๋ ๊น์ด ๋ค์ด๊ฐ๋ณด๊ณ ์ ํ๋ค.
๐ this ๋ฐ์ธ๋ฉ & this ์ ์ฐธ์กฐ๊ฐ
๋ฐ์ธ๋ฉ์ด๋ ์๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ด๋ค.
๋ณ์๊ฐ ์ ์ธ๋ ๋, ๋ณ์ ์ด๋ฆ(์๋ณ์)์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ฐ๊ฒฐ๋๋๋ฐ, ์ด ๊ณผ์ ์ญ์ ๋ฐ์ธ๋ฉ์ด๋ค.
this ๋ฐ์ธ๋ฉ์ this ์๋ณ์์ this ๊ฐ ๊ฐ๋ฆฌํฌ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ด๋ฉฐ, ํจ์ ํธ์ถ ๋ฐฉ์ ๋ฟ๋ง ์๋๋ผ strict mode ์๋ ์ํฅ์ ๋ฐ๋๋ค.
this ๋ฐ์ธ๋ฉ์ด ๋ค๋ฅด๊ฒ ์ด๋ฃจ์ด์ง๋ ๋ช ๊ฐ์ง ์ํฉ์ ์ดํด๋ณด์.
1. ์ ์ญ scope ์์์ this ๋ window ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. window ๋ ์ ์ญ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
console.log(this) // window
2. ์ผ๋ฐ ํจ์ ๋ด๋ถ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก, this ๋ window ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
2-1. strict mode ๊ฐ ์ ์ฉ๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์ this ์์๋ undefined ๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. (๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋ ์ผ๋ฐ ํจ์์์ this ์ ์ญํ ์ ๋ฌด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค)
2-2. ์ด๋ค ํจ์๋ผ๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด this ์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. (์ค์ฒฉ, ์ฝ๋ฐฑ ํจ์ ํฌํจ)
function hello() {
console.log(this)
}
hello() // window
3. ๊ฐ์ฒด์ ๋ฉ์๋ ๋ด์ this ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
3-1. ๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์์ ๊ฒฝ์ฐ์ผ์ง๋ผ๋, ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ค๋ฉด ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
const hello = {
name: 'Haeun',
getName() {
console.log(this)
}
}
hello.getName() // {name: 'Haeun, getName: f}
const hello = {
name: 'Haeun',
getName() {
console.log(this); // {name: 'Haeun, getName: f}
function world () {
console.log(this) // window
}
}
}
4. ์์ฑ์ ํจ์ ๋ด๋ถ์์ this ๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
function Hello (name) {
this.name = name;
console.log(this) // Hello {name: 'kang'}
}
const me = new Hello ('Kang')
๐ (์ฝ๊ฐ์ ์ฌํ) ํจ์ ํธ์ถ ๋ฐฉ์๊ณผ this ํธ์ถ ์์ ์ ๋ฐ๋ฅธ this ๋ฐ์ธ๋ฉ
๋ฉ์๋ ๋ด๋ถ์ this ๋ (๊ทธ๋ฆฌ๊ณ ์์ฑ์ ํจ์ ๋ด๋ถ์ this ๋) ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด๊ฐ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค.
๋ํ, this ์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด๋ ํธ์ถ ์์ ์ ๊ฒฐ์ ๋๋ค.
ํ๋์ ์์ ๋ฅผ ์ดํด๋ณด์.
const person = {
name: 'Kang',
getName() {
console.log(this.name);
}
};
person.getName(); // Kang
์ผ๋ฐ์ ์ธ ๊ฐ์ฒด ๋ฉ์๋์ this binding ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณต์ฌํ์ฌ ์คํํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํจ์๋ก ์คํํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
const person = {
name: 'Kang',
getName() {
console.log(this.name);
}
};
person.getName(); // Kang
const anotherPerson = {
name: 'Kim',
};
anotherPerson.getName = person.getName;
const getName = person.getName;
anotherPerson.getName(); // Kim
getName(); // ''
anotherPerson ์ด๋ผ๋ ์๋ก์ด ๊ฐ์ฒด์ getName ์ด๋ผ๋ ํจ์๋ฅผ ์ฎ๊ฒจ์ ์คํํ์ ๋, this ๋ person ๊ฐ์ฒด๊ฐ ์๋ anotherPerson ์ด ๋์๋ค. ํจ์ ํธ์ถ ์์ ์ this ๊ฐ ๊ฒฐ์ ๋ ์ฌ๋ก์ด๋ค.
๋ํ, getName ์ ์ผ๋ฐ ํจ์๋ก ์ฎ๊ฒจ์ ์คํํ์ ๋์ this ๋ ์ ์ญ ๊ฐ์ฒด์ธ 'window' ๊ฐ ๋๋ค. ํ์ฌ window ์ name ์ด๋ผ๋ ๊ฐ์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์, ์ด๋ ํ ๊ฐ๋ ์ถ๋ ฅํ์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
โจ ์ผ๋ฐ ํจ์์ this ๋ฐ์ธ๋ฉ ์ด์๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
์์ ์ธ๊ธํ๋ฏ, ๋ฌด์์ด๋ ์ผ๋ฐ ํจ์๋ก ์คํํ ๊ฒฝ์ฐ this ์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋์ด, ์ํ๋ ๊ฐ์ ์ป์ง ๋ชปํ ์๋ ์๋ค.
์ด๋ฅผ ์ํ ๋ช ๊ฐ์ง ํด๊ฒฐ์ฑ ์ญ์ ์กด์ฌํ๋ค.
1. ๋ฉ์๋ ๋ด๋ถ์ ์๋ก์ด ๋ณ์๋ฅผ ์ ์ธํ์ฌ this ํ ๋น
// Original Case
var name = 'Global'
const hello = {
name: 'Local',
getName() {
function world () {
console.log(this.name) // Global
}
}
}
// ์ค์ฒฉ ํจ์ ๋ด ์๋กญ๊ฒ ๋ณ์๋ฅผ ์ ์ธํ Case
var name = 'Global'
const hello = {
name: 'Local',
getName() {
const that = this
function world () {
console.log(that.name) // Local
}
}
}
2. this ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉํ ์ ์๋ Javascript method ํ์ฉ
apply, call, bind ์ ์์ธํ ์ธ์๋ MDN ๋ฌธ์์์ ํ์ธํ ์ ์๋ค.
์๋๋ ๊ฐ์ ํจ์๋ฅผ apply ์ call ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ this ๋ฐ์ธ๋ฉํ ์ฌ๋ก์ด๋ค.
apply ์ call ์ ์ ๋ฌํ๋ ์ธ์์ ๋ฐฉ์๋ง ๋ค๋ฅผ ๋ฟ, ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ํน์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ ํจ์์ this ์ ๋ฐ์ธ๋ฉํ๋ค.
// Original Case
function bindingFunc() {
console.log(this) // window
}
// apply, call
const temp = {a:1}
bindingFunc.apply(temp) // {a:1}
bindingFunc.call(temp) // {a:1}
bind ๋ฉ์๋๋ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ this ๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ง ์ ๋ฌํ๋ค.
// Original Case
function bindingFunc() {
console.log(this) // window
}
// bind
const temp = {a:1}
bindingFunc.bind(temp) // ํจ์๊ฐ ํธ์ถ๋์ง ์์
bindingFunc.bind(temp)() // temp ๊ฐ ๋ฐ์ธ๋ฉ ๋์ด ํจ์๊ฐ ํธ์ถ๋จ, {a:1}
โจ ์ ๋ฆฌ
์ด๋ฒ ๊ธ์์ ๋ค๋ฃฌ ๋ด์ฉ์ด ์ ๋ง ๋ง์๋ฐ, ๋ช ๊ฐ์ง๋ง ๊ธฐ์ตํ๋ฉด this ๋ฅผ ํจ์ฌ ์ ํ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
๐ this ๋ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ (๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ฐธ์กฐํ๋) ์๋ณ์์ด๋ค.
๐ this ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋๋ค.
๐ this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์ & ์์ ์ ์ํด ๊ฒฐ์ ๋๋ค.
๐ ์ด๋ ํ ํจ์๋ ์ผ๋ฐ ํจ์์ ํํ๋ก ํธ์ถ ์ this ๋ ์ ์ญ ๊ฐ์ฒด์ธ window ์ด๋ค.
๐ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ Javascript ๋ด์ฅ ํจ์ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ค.
โจ ๋ฐฐ์ด ์
- this... ์ ๋ง ๋ง๋งํ๊ฒ ๋ดค๋ค๊ฐ ํฐ ์ฝ ๋ค์น ๋ปํ๋ค. ์๊ฐ๋ณด๋ค scope ๋ context ์ ์ํฅ์ ๋ง์ด ๋ฐ๋ ์๋ณ์๋ผ๋ ์ฌ์ค์ ๊นจ๋ฌ์๊ณ , ๋ง์ ์ฐ์ต์ ํตํด this ๋ฅผ ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฐ๋ํด์ผ ํ ๊ฒ์ด๋ค.
- Javascript ์ ์ฝ๋๋ฅผ ์ฝ์ด๋ด๋ฆฌ๋ ์ธํฐํ๋ฆฌํฐ์ ์๋ ๊ณผ์ ์ ๋ํ ๋ช ํํ ์ดํด๊ฐ ์์ด๋ "Javascript ๋ฅผ ์ธ ์ค ์๋ค" ๊ณ ํํํ๋ฉด ์๋๋ค. ์ธํฐํ๋ฆฌํฐ๊ฐ ์ฝ๋๋ฅผ ์ฝ๊ณ ์คํํ๋ ๊ณผ์ ์ด ๊ณง Javscript ์ ๊ทผ๋ณธ์ด๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
โจ ์ฐธ๊ณ ์๋ฃ
- The Ultimate Guide to Hoisting, Scopes, and Closures in JavaScript
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive (์ํค๋ถ์ค)
- ์คํ ์ปจํ ์คํธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ
- new ์ฐ์ฐ์์ ์์ฑ์ ํจ์
'๐ป DEV > Javascript & NodeJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] ์คํ ์ปจํ ์คํธ (Execution Context) ์ ์์ค์ฝ๋ (0) | 2021.09.28 |
---|---|
[NodeJS] Node ์ this ๋? (+ ํ์ดํ ํจ์์ this) (2) | 2021.09.10 |
[Javascript] ์ด๋ฒคํธ ๋ฃจํ (Event Loop) ๋? (0) | 2021.09.07 |
[NodeJS] NodeJS ๋ Single Thread ์ผ๊น? Multi Thread ์ผ๊น? (1) | 2021.09.06 |
[Javascript] ๊ตฌ์กฐ๋ถํด ํ ๋น (0) | 2021.06.05 |
๋๊ธ