ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] this
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 7. 26. 21:23this ํค์๋
this๋ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฅดํค๋ ์๊ธฐ ์ฐธ์กฐ ๋ณ์์ ๋๋ค. this๋ฅผ ํตํด ์์ ์ด ์ํ ๊ฐ์ฒด ๋๋ ์์ ์ด ์์ฑํ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
// ์์ฑ์ ํจ์
function Circle(radius) {
// this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
this.radius = radius;
}
Circle.prototype.getDiameter = function () {
// this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
return 2 * this.radius;
};
// ์ธ์คํด์ค ์์ฑ
const circle = new Circle(5);
console.log(circle.getDiameter()); // 10
์๋ฐ์คํฌ๋ฆฝํธ๋ this๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ, ์ฆ *this ๋ฐ์ธ๋ฉ์ ํจ์ ํธ์ถ ๋ฐฉ์์ ์ํด ๋์ ์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค. ( ์๋ฐ๊ฐ์ ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์์ this๋ ์ธ์ ๋ ํด๋์ค๊ฐ ์์ฑํ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด)
- this๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์๋ฌต์ ์ผ๋ก ์์ฑ๋๊ณ , ์ฝ๋ ์ด๋์๋ ์ฐธ์กฐ ๊ฐ๋ฅ
- ํจ์๋ฅผ ํธ์ถํ๋ฉด arguments ๊ฐ์ฒด์ this๊ฐ ์๋ฌต์ ์ผ๋ก ํจ์ ๋ด๋ถ์ ์ ๋ฌ๋จ
- arguments๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก this๋ ์ง์ญ ๋ณ์์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
- strict mode๊ฐ ์ ์ฉ๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์ this์๋ undefined๊ฐ ๋ฐ์ธ๋ฉ (this์ ํ์์ฑX)
*this ๋ฐ์ธ๋ฉ : ๋ฐ์ธ๋ฉ์ด๋ ์๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ ์๋ฏธํจ. this ๋ฐ์ธ๋ฉ์ this๊ฐ ๊ฐ๋ฆฌํฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ.
์ด์ฒ๋ผ ๊ฐ์ฒด๋ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์ ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ฅผ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ ๋ณตํฉ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋์์ ๋ํ๋ด๋ ๋ฉ์๋๋ ์์ ์ด ์ํ ๊ฐ์ฒด์ ์ํ(ํ๋กํผํฐ)๋ฅผ ์ฐธ์กฐํ๊ณ ๋ณ๊ฒฝํ ์ ์์ด์ผํฉ๋๋ค.
ํจ์ ํธ์ถ ๋ฐฉ์๊ณผ this ๋ฐ์ธ๋ฉ
this ๋ฐ์ธ๋ฉ(this์ ๋ฐ์ธ๋ฉ๋ ๊ฐ)์ ํจ์ ํธ์ถ ๋ฐฉ์, ์ฆ ํจ์๊ฐ ์ด๋ป๊ฒ ํธ์ถ๋์๋์ง์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.
ํจ์ ํธ์ถ ๋ฐฉ์ | this ๋ฐ์ธ๋ฉ |
์ผ๋ฐ ํจ์ ํธ์ถ | ์ ์ญ ๊ฐ์ฒด |
๋ฉ์๋ ํธ์ถ | ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด |
์์ฑ์ ํจ์ ํธ์ถ | ์์ฑ์ ํจ์๊ฐ (๋ฏธ๋์) ์์ฑํ ์ธ์คํด์ค |
Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ | Function.prototype.apply/call/bind ๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ฒด |
๋ฐ๋ผ์ ์๋ ์์์ ๊ฐ์ด ๋์ผํ ํจ์๋ ์ผ๋ฐ ํจ์ ํธ์ถ, ๋ฉ์๋ ํธ์ถ, ์์ฑ์ ํจ์ ํธ์ถ, Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ๊ณผ ๊ฐ์ด ๋ค์ํ ๋ฐฉ์์ผ๋ก ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
const foo = function () {
console.dir(this);
};
// 1. ์ผ๋ฐ ํจ์ ํธ์ถ
foo(); // window
// 2. ๋ฉ์๋ ํธ์ถ
const obj = { foo };
obj.foo(); // obj
// 3. ์์ฑ์ ํจ์ ํธ์ถ
new foo(); // foo {}
// 4. Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ
const bar = { name: 'bar' };
foo.call(bar); // bar
foo.apply(bar); // bar
foo.bind(bar)(); // bar
์ผ๋ฐ ํจ์ ํธ์ถ
๊ธฐ๋ณธ์ ์ผ๋ก this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋์ด ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ๋ชจ๋ ํจ์(์ค์ฒฉ ํจ์, ์ฝ๋ฐฑ ํจ์ ํฌํจ) ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
// value๋ ์ ์ญ ๊ฐ์ฒด ํ๋กํผํฐ
var value = 1;
const obj = {
value: 100,
foo() {
console.log("foo's this: ", this); // {value: 100, foo: f}
console.log("foo's this: ", this.value); // 100
// ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ
setTimeout(function () {
console.log("callback's this: ", this); // window
console.log("callback's this: ", this.value); // 1
}, 100);
// ๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์
function bar() {
console.log("bar's this: ", this); // window
console.log("bar's this: ", this.value); // 1
}
// ์ค์ฒฉํจ์๋ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด ์ค์ฒฉ ํจ์ ๋ด๋ถ์ this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ
bar();
}
};
obj.foo();
ํ์ง๋ง ์ ์์ ์ฒ๋ผ ๋ฉ์๋ ๋ด์์ ์ ์ํ ์ค์ฒฉ ํจ์ ๋๋ ๋ฉ์๋์๊ฒ ์ ๋ฌํ ์ฝ๋ฐฑ ํจ์(๋ณด์กฐ ํจ์)๋ ํฌํผ ํจ์์ ์ญํ ์ ํ๋ฏ๋ก this๊ฐ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์๋์ this ๋ฐ์ธ๋ฉ๊ณผ ํฌํผ ํจ์์ this ๋ฐ์ธ๋ฉ์ ์ผ์น์ํค๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
- this ๋ฐ์ธ๋ฉ์ ๋ณ์์ ํ ๋นํด this๋์ ๋ณ์๋ฅผ ์ฐธ์กฐ
- this๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋ฉํ ์ ์๋ ๋ฉ์๋(Function.prototype.apply/call/bind) ์ฌ์ฉ
- ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉ
๋ฉ์๋ ํธ์ถ
๋ฉ์๋ ๋ด๋ถ์ this์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด, ์ฆ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฉ์๋ ์ด๋ฆ ์์ ๋ง์นจํ(.) ์ฐ์ฐ์ ์์ ๊ธฐ์ ํ ๊ฐ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
const person = {
name: 'Lee',
getName() {
// ๋ฉ์๋ ๋ด๋ถ์ this๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ
return this.name;
}
};
// ๋ฉ์๋ getName์ ํธ์ถํ ๊ฐ์ฒด๋ person
console.log(person.getName()); // Lee
const anotherPerson = {
name: 'Kim'
};
// getName ๋ฉ์๋๋ฅผ anotherPerson ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ํ ๋น
anotherPerson.getName = person.getName;
// getName ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๋ anotherPerson
console.log(anotherPerson.getName()); // Kim
// getName ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋น
const getName = person.getName;
// getName ๋ฉ์๋๋ฅผ ์ผ๋ฐ ํจ์๋ก ํธ์ถ
console.log(getName()); // ''
// ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ getName ํจ์ ๋ด๋ถ์ this.name์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ window.name๊ณผ ๊ฐ์
- person ๊ฐ์ฒด์ getName ํ๋กํผํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํจ์ ๊ฐ์ฒด๋ person๊ฐ์ฒด์ ํฌํจ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๋ณ๋์ ๊ฐ์ฒด์ด๊ณ ํ๋กํผํฐ๊ฐ ํจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ ๋ฟ์
- getName ๋ฉ์๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ํ ๋นํ๋ ๊ฒ์ผ๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ๋ ์ ์์
- getName ๋ฉ์๋๋ ์ผ๋ฐ ๋ณ์์ ํ ๋นํ์ฌ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ ๊ฐ๋ฅ
๋ฐ๋ผ์ ๋ฉ์๋ ๋ด๋ถ์ this๋ ํ๋กํผํฐ๋ก ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด์๋ ๊ด๊ณ๊ฐ ์๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์์ฑ์ ํจ์ ํธ์ถ
์์ฑ์ ํจ์ ๋ด๋ถ์ this์๋ ์์ฑ์ ํจ์๊ฐ (๋ฏธ๋์) ์์ฑํ ์ธ์คํด์ค๊ฐ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
// ์์ฑ์ ํจ์
function Circle(radius) {
// this๋ ์์ฑ์ ํจ์๊ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// ์ธ์คํด์ค ์์ฑ
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20
// new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ง ์์ผ๋ฉด ์์ฑ์ ํจ์๋ก ๋์X
const circle3 = Circle(15);
console.log(circle3); // undefined
// ๋ฐ๋ผ์ ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋ circle3 ๋ด๋ถ์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด
console.log(radius); // 15
Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ
apply, call, bind ๋ฉ์๋๋ Function.prototype์ ๋ฉ์๋๋ก ๋ชจ๋ ํจ์๊ฐ ์์๋ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Function.prototype.apply : this๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ํธ์ถ
// thisArg : this๋ก ์ฌ์ฉํ ๊ฐ์ฒด
// argsArray : ํจ์์๊ฒ ์ ๋ฌํ ์ธ์ ๋ฆฌ์คํธ์ ๋ฐฐ์ด ๋๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด
// ๋ฐํ๊ฐ : ํธ์ถ๋ ํจ์์ ๋ฐํ๊ฐ
Function.prototype.apply(thisArg, [argsArray]);
- Function.prototype.call : this๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ ๋ฆฌ์คํธ ํ์์ผ๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ํธ์ถ
// thisArg : this๋ก ์ฌ์ฉํ ๊ฐ์ฒด
// args1, args2, ... : ํจ์์๊ฒ ์ ๋ฌํ ์ธ์ ๋ฆฌ์คํธ
// ๋ฐํ๊ฐ : ํธ์ถ๋ ํจ์์ ๋ฐํ๊ฐ
Function.prototype.call(thisArg, args1, args2, ...);
- Function.prototype.bind : apply์ call ๋ฉ์๋์ ๋ฌ๋ฆฌ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ผ๋ก this ๋ฐ์ธ๋ฉ์ด ๊ต์ฒด๋ ํจ์๋ฅผ ์๋กญ๊ฒ ์์ฑํด ๋ฐํ
function getThisBinding() {
return this;
}
console.log(getThisBinding()); // window
// this๋ก ์ฌ์ฉํ ๊ฐ์ฒด
const thisArg = { a: 1 };
// bind๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ thisArg๋ก this ๋ฐ์ธ๋ฉ์ด ๊ต์ฒด๋ getThisBindingํจ์๋ฅผ ์์ฑํด ๋ฐํ
console.log(getThisBinding.bind(thisArg)); // getThisBinding
// bind๋ ํจ์๋ฅผ ํธ์ถํ์ง๋ ์์์ ๋ช
์์ ์ผ๋ก ํธ์ถํด์ผํจ
console.log(getThisBinding.gind(thisArg)()); // {a: 1}
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ํด๋ก์ (0) | 2022.07.27 |
---|---|
[JavaScript] ์คํ ์ปจํ ์คํธ (0) | 2022.07.27 |
[JavaScript] ๋นํธ์ธ ๊ฐ์ฒด (0) | 2022.07.25 |
[JavaScript] strict mode (0) | 2022.07.24 |
[JavaScript] ํ๋กํ ํ์ (0) | 2022.07.24 |
- Total
- Today
- Yesterday
- ํฌํฌ์ธํฐ
- ์ด์์ฒด์
- fp
- ์นด์นด์ค ์ธํด
- ๋ฐฑ์ค node.js
- git
- http
- ์ด๋ถํ์
- ํ๋กํผํฐ
- ๋ ์์ปฌ ํ๊ฒฝ
- map
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ์ฝ๋ฉํ ์คํธ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- Baekjoon
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- TDD
- ์ ์ญ ๋ณ์
- ๋์์ธ ํจํด
- ๋ฐฑ์ค javascript
- JavaScript
- ์๋ฐ
- ํ๋กํ ์ฝ
- ๋คํธ์ํฌ
- ๋ฐฑ์ค
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์๊ณ ๋ฆฌ์ฆ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |