์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์ฝ๋ฉํ ์คํธ
- ๋ฐ๋ธ์ฝ์ค3๊ธฐ
- history api
- CSS
- ํ๋ก๊ทธ๋๋จธ์ค
- position
- ๋ธ๋ก๊ทธ
- Flex
- ์๊ณ ๋ฆฌ์ฆ
- REACT
- float
- useEffect
- useRef
- Gatsby
- ์๋ฐ์คํฌ๋ฆฝํธ
- fetch API
- Props
- ํ๋ก ํธ์๋
- ๋ฐ๋ธ์ฝ์ค
- Today
- Total
Daehyunii's Dev-blog
22์ฅ this ๋ณธ๋ฌธ
22์ฅ this
Daehyunii 2022. 7. 19. 21:5422.1 this ํค์๋
๊ฐ์ฒด์ ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ ์์ ์ด ์ํ ๊ฐ์ฒด์ ์ํ, ์ฆ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํ๋ค. ์ด๋ ๋ฉ์๋๊ฐ ์์ ์ด ์ํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด ๋จผ์ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋ค. ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ๋ฉ์๋ ๋ด๋ถ์์ ๋ฉ์๋ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค.
const circle = {
radius : 5,
getDiameter(){
return 2 * circle.radius // ์ฌ๊ท์ ์ผ๋ก ์ฐธ์กฐ
}
};
console.log(circle.getDiameter()); // 10
ํ์ง๋ง, ์์ฑ์ ํจ์์ ๊ฒฝ์ฐ ์์ฑ์ ํจ์ ๋ด๋ถ์์๋ ํ๋กํผํฐ ๋๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋๋ฐ, ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๋จผ์ ์์ฑ์ ํจ์๋ฅผ ์ ์ํ ์ดํ new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ ๋จ๊ณ๊ฐ ์ถ๊ฐ๋ก ํ์ํ๋ค. ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๋ ์์ ์๋ ์์ง ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ด์ ์ด๋ฏ๋ก ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ ์ ์๋ค. ์ด๋ฅผ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ๋ this๋ผ๋ ํน์ํ ์๋ณ์๋ฅผ ์ ๊ณตํ๋ค. this๋ ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์๋ค. this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
const circle = {
radius : 5,
getDiameter(){
return 2 * this.radius // circle๊ฐ์ฒด๊ฐ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ์ผ๋ฏ๋ก, circle์ ๊ฐ๋ฆฌํด
}
};
console.log(circle.getDiameter()); // 10
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฉ์๋ ๋ด๋ถ์์์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด, ์ฆ circle์ ๊ฐ๋ฆฌํจ๋ค. ์์ฑ์ ํจ์๋ก ํธ์ถ๋๋ ๊ฒฝ์ฐ, ์์ฑ์ ํจ์ ๋ด๋ถ์ this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
function Circle(radius) {
this.radius = radius; // ์์ฑ์ ํจ์์ ์ํด ๋ฏธ๋์ ์์ฑ ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
this.getDiameter = function(){
return 2 * this.radius
}
};
const circle1 = new Circle(10);
console.log(circle1.getDiameter()); // 20
์์ ์ฝ๋์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ this๋ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ this์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
22.2 ํจ์ ํธ์ถ ๋ฐฉ์๊ณผ this ๋ฐ์ธ๋ฉ
this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์, ์ฆ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ค. ํจ์๋ ๋ค์ํ ๋ฐฉ์์ ์ํด ํธ์ถํ ์ ์๋ค.
1. ์ผ๋ฐ ํจ์ ํธ์ถ
2. ๋ฉ์๋ ํธ์ถ
3. ์์ฑ์ ํจ์ ํธ์ถ
4. Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ
22.2.1 ์ผ๋ฐ ํจ์ ํธ์ถ
๊ธฐ๋ณธ์ ์ผ๋ก this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ ๋๋ค. ์ค์ฒฉ ํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก ํธ์ถํ๋ฉด ํจ์ ๋ด๋ถ์ this์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์ฝ๋ฐฑ ํจ์๊ฐ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ค๋ฉด ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์ฆ, ์ด๋ ํ ํจ์๋ผ๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด this์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
function foo(){
console.log(this); // window
function bar(){
console.log(this); // window
}
bar();
}
foo();
22.2.2 ๋ฉ์๋ ํธ์ถ
๋ฉ์๋ ๋ด๋ถ์ this์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด, ์ฆ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฉ์๋ ์ด๋ฆ ์์ ๋ง์นจํ ์ฐ์ฐ์ ์์ ๊ธฐ์ ํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์ฃผ์ํด์ผํ ๊ฒ์ ๋ฉ์๋ ๋ด๋ถ์ this๋ ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด๊ฐ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค๋ ๊ฒ์ด๋ค.
const person = {
name : 'lee',
getName(){
return this.name;
}
};
//๋ฉ์๋๋ก ํธ์ถ
console.log(person.getName()); // lee(getName๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ธ person์ this๊ฐ ๋ฐ์ธ๋ฉ๋จ)
//์ผ๋ฐ ํจ์๋ก ํธ์ถ
const getName = person.getName;
console.log(getName()); // ๋น ๋ฌธ์์ด ๋ฐํ(window.name์๋ ๋น ๋ฌธ์์ด์ด ๋ค์ด ์์)
์์ ์ฝ๋์ฒ๋ผ getName ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์ ๊ฐ์ฒด, ์ฆ getName ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ํ ๋นํ๋ ๊ฒ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ๋ ์๋ ์๊ณ ์ผ๋ฐ ๋ณ์์ ํ ๋นํ์ฌ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ์๋ ์๋ค.(ํธ์ถ ๋ฐฉ์์ ๋ค์ํ๊ฒ ํ ์ ์์) ๊ทธ๋ฌ๋ฏ๋ก ๋ฉ์๋ ๋ด๋ถ์ this๋ ํ๋กํผํฐ๋ก ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด์๋ ๊ด๊ณ๊ฐ ์๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ค.
22.2.3 ์์ฑ์ ํจ์ ํธ์ถ
์์ฑ์ ํจ์ ๋ด๋ถ์ this์๋ ์์ฑ์ ํจ์๊ฐ ๋ฏธ๋์ ์์ฑํ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
function Circle(radius) {
this.radius = radius; // ์์ฑ์ ํจ์์ ์ํด ๋ฏธ๋์ ์์ฑ ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
this.getDiameter = function(){
return 2 * this.radius
}
};
const circle1 = new Circle(10);
console.log(circle1.getDiameter()); // 20
๋ง์ฝ new ์ฐ์ฐ์ ์์ด ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ์ผ๋ฐ ํจ์๋ก ํธ์ถํ๊ฒ ๋๋ค. ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ ๊ฒฝ์ฐ์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
// ์์ฑ์ ํจ์๋ฅผ new ์ฐ์ฐ์ ์์ด ํธ์ถํ ๊ฒฝ์ฐ
function Circle(radius) {
this.radius = radius; // ์์ฑ์ ํจ์์ ์ํด ๋ฏธ๋์ ์์ฑ ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
this.getDiameter = function(){
return 2 * this.radius
}
};
const circle1 = Circle(10);
console.log(circle1); // undefined ๋ฐํ(๋ฐํ ๊ฐ์ด ์์ผ๋ฏ๋ก undefined ๋ฐํ
//์ ๋ถ window ๊ฐ์ฒด์ ํ๋กํผํฐ/๋ฉ์๋๊ฐ ๋๋ฒ๋ฆผ
console.log(window.radius); // 10
console.log(window.getDiameter()); // 20
22.2.4 Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ
Function.prototype.apply/call/bind ๋ฉ์๋๋ Function.prototype์ ๋ฉ์๋๋ค. ์ฆ, ์ด๋ค ๋ฉ์๋๋ ๋ชจ๋ ํจ์๊ฐ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. apply/call ๋ฉ์๋๋ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ค. ์ฆ, ์ฒซ๋ฒ์งธ ์ธ์๋ก this์ ๋ฐ์ธ๋ฉ ํ ๊ฐ์ฒด๋ฅผ ๋ฃ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ถํฐ ํธ์ถ ํ ํจ์์ ์ธ์๋ฅผ ์ง์ด๋ฃ๋๋ค.(์ธ์ ์ ๋ฌ ๋ฐฉ์์ ์ฐจ์ด๋ง ์กด์ฌํจ)
function getThisBinding(){
console.log(arguments);
return this;
}
const thisArg = { x : 1 };
console.log(getThisBinding()); // window
console.log(getThisBinding.apply(thisArg, [1,2,3]));
// Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
// {x: 1}
console.log(getThisBinding.call(thisArg, 1, 2));
// Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
// {x: 1}
์ด์ฒ๋ผ Function ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก this ๋ฐ์ธ๋ฉ์ ์ง์ ํ๊ณ ์ธ์๋ฅผ ์ ๋ฌํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค. Function.prototype.bind ๋ฉ์๋๋ apply์ call ๋ฉ์๋์ ๋ฌ๋ฆฌ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ง ์ ๋ฌํ๋ค.
function getThisBinding(){
console.log(arguments);
return this;
}
const thisArg = { x : 1 };
console.log(getThisBinding.bind(thisArg)()); // {x: 1}(ํธ์ถ์ ๋ณ๋๋ก ํด์ค์ผํจ)
'๐ Language & CS knowledge > JavaScript (๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Dive)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
24์ฅ ํด๋ก์ (0) | 2022.07.22 |
---|---|
23์ฅ ์คํ ์ปจํ ์คํธ (0) | 2022.07.20 |
21์ฅ ๋นํธ์ธ ๊ฐ์ฒด (0) | 2022.07.18 |
20์ฅ strict mode (0) | 2022.07.16 |
19์ฅ ํ๋กํ ํ์ (0) | 2022.07.13 |