this ๋?
- this๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ๋ ํค์๋์ด๋ฉฐ ์ด๋ this๋ ํด๋น ์ฝ๋๋ฅผ ์คํํ๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ํ๋ธ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์์ this๋ ์กฐ๊ธ ๋ค๋ฅด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ this๋ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์์ด๋ค. this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด๋ ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
this์ ๋ฐ์ธ๋ฉ
function sayName() {
const name = 'yunCow'
console.log(this.name)
}
sayName(); // ?
- ์ฝ๋๋ง ๋ฑ ๋ดค์๋ console.log์ 'yunCow'๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์์ this๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ ํจ์์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. ์ด๊ฑธ this ๋ฐ์ธ๋ฉ์ด๋ผ ๋ถ๋ฅธ๋ค.
- this ๋ฐ์ธ๋ฉ์๋ 5๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
- ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ
- ์์์ ๋ฐ์ธ๋ฉ
- ๋ช ์์ ๋ฐ์ธ๋ฉ
- new ๋ฐ์ธ๋ฉ
- ํ์ดํ ํจ์ ๋ฐ์ธ๋ฉ
๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ
- ๊ท์น์ด ์ ์ฉ๋์ง ์๋ ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ด๋ค.
- ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ผ๋ this๋ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค. ์์์๋ ์ฝ๋๊ฐ ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ด๋ฉฐ undefined๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
window.name = 'haha'
function sayName() {
const name = 'yunCow'
console.log(this.name)
}
sayName(); // 'haha'
//////////////////////////////
'use strict'
window.name = 'haha'
function sayName() {
const name = 'yunCow'
console.log(this.name)
}
sayName(); // TypeError: Cannot read property 'name' of undefined
- ์ ์ญ๊ฐ์ฒด window์ name์ ํ ๋นํ๋ฉด name์ ์ถ๋ ฅํด์ค๋ค.
- ํ์ง๋ง ์๊ฒฉ๋ชจ๋์ธ use strict๋ฅผ ์ ์ฉํ๋ฉด ์ ์ญ๊ฐ์ฒด๋ ํญ์ ์ ์ธ๋๊ณ ์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ this๋ undefined๋ฅผ ๋ฐํํ๋ค.
์์์ ๋ฐ์ธ๋ฉ
- ์์์ ๋ฐ์ธ๋ฉ์ ํจ์๊ฐ ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋๋ ์ํฉ์์ this๊ฐ ๋ฐ์ธ๋ฉ ๋๋ ๊ฒ ์ด๋ค.
- ์ด๋ this๋ ์ ์ํ ๊ฐ์ฒด, ์ฆ ์ปจํ ์คํธ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
const sayName = {
name:'yunCow',
fun: function() {
console.log(this.name)
}
}
sayName.fun(); // 'yunCow'
setTimeout(sayName.fun,100) // ' '
- ๊ฐ์ฒด์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ ๋๋ก ์๋ํ์ง๋ง ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ก ๋๊ฒจ ์ฌ์ฉํ ๋ fun์ด๋ผ๋ ํจ์์ผ ๋ฟ sayName์ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ์ ์์์ ๋ฐ์ธ๋ฉ์ด ์์ค๋๋ค.
- ์ฆ setTimeout ๋ด๋ถ์์ ํธ์ถ๋๋ ์ฝ๋ฐฑ์ ๊ฐ์ฒด์ ์ปจํ ์คํธ์์ ์คํ๋๋ ๊ฒ์ด ์๋๊ธฐ์ ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์ด ์ ์ฉ๋์ด ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋๋ค.
๋ช ์์ ๋ฐ์ธ๋ฉ
- ์๋ฐ์คํฌ๋ฆฝํธ์ Function์ call(), apply(), bind()๋ผ๋ ํ๋กํ ํ์ ๋ฉ์๋๊ฐ ์๋ค. ์ด 3๊ฐ์ง ์ค ํ๋๋ฅผ ํธ์ถํ์ฌ this ๋ฐ์ธ๋ฉ์ ์ฝ๋์ ๋ช ์ํ๋๊ฒ์ ๋ช ์์ ๋ฐ์ธ๋ฉ์ด๋ผ ํ๋ค.
- this๋ ์ด๋ ๊ฒ ๋ช ์์ ์ผ๋ก ์ ํํ์ฌ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
// call ์ฌ์ฉ
const sayName = { name:'yunCow' }
function test() {
console.log(this.name)
}
test.call(sayName) // 'yunCow'
// apply ์ฌ์ฉ
const sayName = { name:'yunCow' }
function test() {
console.log(this.name)
}
test.apply(sayName) // 'yunCow'
// bind ์ฌ์ฉ
const sayName = { name:'yunCow' }
function test() {
console.log(this.name)
}
const test2 = test.bind(sayName)
test2(); // 'yunCow'
- test ํจ์์ call, apply๋ฅผ ์ ์ฉํด sayName๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค์ผ๋ก this์ ์ปจํ ์คํธ๋ฅผ sayName์ ๋ฐ์ธ๋ฉ ํด์ค ์ ์๋ค.
- call๊ณผ apply์ ์ฐจ์ด์ ์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ฒด์ ์ธ์๋ฅผ ์ ๋ฌํด ์ฃผ๋๋ฐ ์ด๋ call์ ๋งค๊ฐ๋ณ์์ ๋ชฉ๋ก, apply๋ ๋ฐฐ์ด์ ๋ฐ๊ฒ๋๋ค.
- bind๋ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ก this๊ฐ ๋ฐ์ธ๋ฉ๋ ํจ์๋ฅผ ๋ฐํ ํ๋ค. ์ด๊ฑธ ํ๋ ๋ฐ์ธ๋ฉ์ด๋ผ ๋ถ๋ฅด๋ฉฐ ์ดํ ์ด ํจ์๋ ํธ์ถ๋ ๋๋ง๋ค ์ง์ ๋ ๊ฐ์ฒด์ this ๋ฐ์ธ๋ฉ์ ๊ฐ์ง๊ณ ํธ์ถ๋๋ค.
new ๋ฐ์ธ๋ฉ
- ์๋ฐ์คํฌ๋ฆฝํธ์ new ํค์๋๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ค.
- ์ด๋ ๊ฒ ์ฌ์ฉ๋๋ ํจ์๋ฅผ ์์ฑ์ ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. (์์ฑ์ ํจ์๋ ๋๋ฌธ์๋ก ์์ํ๋๊ฒ ๊ธฐ๋ณธ ์ปจ๋ฒค์ )
- ์์ฑ์ ํจ์์์๋ thisํค์๋๋ฅผ ํด๋น ์์ฑ์๋ฅผ ์ด์ฉํด ์์ฑํ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ก ์ฌ์ฉํ๋ค.
function SayName() {
this.name = 'yunCow'
}
const Name = new SayName();
console.log(Name.name) // 'yunCow'
- SayName ํจ์์ new ํค์๋๋ก ํธ์ถํ๋ฉด ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ๊ทธ ๊ฐ์ฒด์ this๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
- ์์ฑ๋ ๊ฐ์ฒด์ name์ด๋ผ๋ ์์ฑ์ yunCow ๊ฐ ํ ๋น๋๊ณ ๊ฐ์ฒด๋ Name์ด๋ผ๋ ๋ณ์์ ํ ๋น๋๋ค.
ํ์ดํ ํจ์
- ํ์ดํ ํจ์๋ ES6์ ์ถ๊ฐ๋ ๋ฌธ๋ฒ์ผ๋ก this๋ฅผ ๋ฐ์ธ๋ฉํ ๋์ ๊ท์น๋ค์ด ์ ์ฉ๋์ง ์๋๋ค.
- ํ์ดํ ํจ์๋ ๋ ์์ปฌ ์ค์ฝํ(์์ ์ด ์ ์ธ๋ ๊ณณ์ ๊ธฐ์ตํ๋ ์ค์ฝํ)์ ์ํด ์ปจํ ์คํธ ๊ฐ์ฒด๊ฐ this์ ๋ฐ์ธ๋ฉ๋๋ค.
const sayName = {
name:'yunCow',
fun: () => {
console.log(this.name)
}
}
sayName.fun(); // ' '
const sayName = {
name: "yunCow",
fun: function () {
setTimeout(() => {
console.log(this.name);
}, 1);
},
};
sayName.fun(); // 'yunCow'
- ์ฒซ๋ฒ์งธ ์์์ ํ์ดํ ํจ์๋ก ์ ์ํ ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง ์๊ณ ์์ ์ปจํ ์คํธ์ธ window๋ฅผ ๊ฐ๋ฅดํค๋ฏ๋ก ๋ฉ์๋๋ฅผ ํ์ดํ ํจ์๋ก ์ ์ํ๋ ๊ฑด ๋ฐ๋์งํ์ง ์๋ค. ( ES6์ ์ถ์ฝ ๋ฉ์๋ ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. )
- ํ์ดํ ํจ์๋ฅผ ๋ฉ์๋ ํจ์ ๋ด์ setTimeout ์ฝ๋ฐฑํจ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ this๋ sayName ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๊ณ ์์ผ๋ฏ๋ก ์คํ๋ ๋์ name์ 'yunCow' ๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
- this์์์ ํ์ดํ ํจ์๋ apply, bind ๋ฑ ํจ์๋ newํจ์๋ก ์ค๋ฒ๋ผ์ด๋ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ฐฑํจ์์๋ง ์ฌ์ฉํ๋๋ก ํ์.
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ค์ฝํ ์ฒด์ธ(Scope chain) (2) | 2022.08.28 |
---|---|
์ค์ฝํ(Scope) (0) | 2022.08.28 |
์ค๋ณต์์ ์ ๊ฑฐ๋ฐฉ๋ฒ์ ์์๋ณด์ (0) | 2022.08.26 |
sort ๋ฉ์๋๋ฅผ ๋ฐฐ์๋ณด์ (0) | 2022.08.24 |
toString์ ์์๋ณด์ (0) | 2022.08.20 |