[JavaScript] this

HyeJeanยท2024๋…„ 3์›” 11์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
6/13
post-thumbnail

๐Ÿ” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this

ใ€€thisBinding์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„์— ์ƒ์„ฑ๋˜๋ฉฐ, ์ด ๋•Œ this๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋กœ๋Š” this๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ์ง€ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค.

ใ€€thisBinding์€ JavaScript์—์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ์˜ this ๊ฐ’์„ ํŠน์ • ๊ฐ์ฒด๋กœ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด this์™€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋™์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

1) ์ „์—ญ ๊ณต๊ฐ„์—์„œ ์‚ฌ์šฉ ์‹œ

ใ€€์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ์ „์—ญ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ „์—ญ ๊ฐ์ฒด๋Š” ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” window ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ , Node.js ํ™˜๊ฒฝ์—์„œ๋Š” global ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ใ€€์ „์—ญ ๊ฐ์ฒด๋Š” ์ „์—ญ ๋ฒ”์œ„์— ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋กœ, ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ์ „์—ญ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์—ญ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์™€ ํ•จ์ˆ˜๊ฐ€ ์ด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋กœ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์—ญ ๋ฒ”์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

console.log(this === window); // ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ true
console.log(this === global); // Node.js ํ™˜๊ฒฝ์—์„œ true

์ฒซ ํ–‰์€ ์ „์—ญ ๊ฐ์ฒด์ธ window ๊ฐ์ฒด์™€ this๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ true๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ํ–‰์€ global ๊ฐ์ฒด์™€ this๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ true๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

2) ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ

ใ€€์–ด๋–ค ํ•จ์ˆ˜๋„ ์†Œ์œ ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๊ฐ€ ์ „์—ญ ๋ฒ”์œ„์—์„œ ํ˜ธ์ถœ๋  ๋•Œ, JavaScript ์—”์ง„์€ this๋ฅผ ์ „์—ญ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๊ฒƒ์€ "์ „์—ญ ํ˜ธ์ถœ"์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ „์—ญ ๋ฒ”์œ„์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

ใ€€ES6๋ถ€ํ„ฐ ๋„์ž…๋œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(arrow function)๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์ž์ฒด์ ์ธ this๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒ์œ„ ํ•จ์ˆ˜์˜ this๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ thisBinding๊ณผ ๊ด€๋ จ๋œ ์ผ๋ฐ˜ํ™” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ this๊ฐ€ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž์ฒด์ ์ธ this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

// ์ผ๋ฐ˜ ํ•จ์ˆ˜
function myFunction() {
    console.log(this);
}

myFunction(); // this๋Š” ์ „์—ญ ๊ฐ์ฒด(window)

// arrow ํ•จ์ˆ˜
const myObject = {
    myMethod() {
        const myArrowFunction = () => {
            console.log(this);
        };
        myArrowFunction();
    }
};

myObject.myMethod(); // this๋Š” myMethod๊ฐ€ ์†ํ•œ ๊ฐ์ฒด (=myObject)

3) method ํ˜ธ์ถœ ์‹œ

ใ€€method ํ˜ธ์ถœ ์‹œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ this๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฉ”์†Œ๋“œ๋ช… ์•ž์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ this๊ฐ€ ๋œ๋‹ค. ์  ํ‘œ๊ธฐ๋ฒ• ๋˜๋Š” ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์—์„œ ์•ž์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ this๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

const myObject = {
    myMethod() {
        console.log(this);
    }
};

myObject.myMethod(); // this๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด (=myObject)

๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์™€ ๊ด€๋ จ๋œ ๋™์ž‘์„ ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

4) callback ํ˜ธ์ถœ ์‹œ

ใ€€๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜ this์™€ ๋™์ผํ•˜๋‹ค. (ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด) ํ•˜์ง€๋งŒ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑ์˜ this๋ฅผ ์ง€์ •ํ•ด๋‘” ๊ฒฝ์šฐ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ์ง€์ •๋œ ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ this๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

*๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๋ฐฉ๋ฒ• : call(), apply(), bind() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

* call ๋ฉ”์„œ๋“œ

call ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋กœ ์ง€์ •ํ•œ๋‹ค. ์ธ์ž๋กœ ๋„˜๊ธด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋กœ ์„ค์ •๋œ๋‹ค.

const myObject = { value: 123 };

function myFunction() {
  console.log(this.value);
}

myFunction.call(myObject); // 123

* apply ๋ฉ”์„œ๋“œ

apply ๋ฉ”์„œ๋“œ๋Š” call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์ธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›๋Š”๋‹ค. ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋กœ ์„ค์ •๋œ๋‹ค.

const myObject = { value: 123 };

function myFunction() {
  console.log(this.value);
}

myFunction.apply(myObject); // 123

* bind ๋ฉ”์„œ๋“œ

bind ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  this ๊ฐ’์„ ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์›๋ณธ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ this ๊ฐ’์ด ๊ณ ์ •๋œ๋‹ค.

const myObject = { value: 123 };

function myFunction() {
  console.log(this.value);
}

const result = myFunction.bind(myObject);
result(); // 123

5) ์ƒ์„ฑ์ž ํ•จ์ˆ˜(new ์—ฐ์‚ฐ์ž) ํ˜ธ์ถœ ์‹œ

ใ€€์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๊ฐ€ ๋œ๋‹ค.

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const person1 = new Person('cho', 30);
const person2 = new Person('megu', 26);

console.log(person1.name); // 'cho'
console.log(person2.age); // 26

์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ 3๊ฐ• this

0๊ฐœ์˜ ๋Œ“๊ธ€