[JavaScript] This์— ๋Œ€ํ•œ ์–•์€ ํƒ๊ตฌ
728x90

๋“ค์–ด๊ฐ€๋ฉฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ง€์‹์ด 1mm ๋‚ด๋ฆฐ ๋น„์ฒ˜๋Ÿผ ์žˆ์„๋ž‘ ๋ง๋ž‘ ํ–ˆ๋˜ ์‹œ์ ˆ..

this์— ๋Œ€ํ•œ ์„ค๋ช…๊ธ€๋“ค์„ ๋ด๋„ ๋„๋ฌด์ง€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.

์ด๊ฒŒ ๋ญ”๊ฐ€์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๋Š”๊ฑด ์•Œ๊ฒ ๋Š”๋ฐ ๊ทธ๋ž˜์„œ... ์–ด๋–ป๊ฒŒ ๋œ๋‹ค๋Š” ? ?..

this๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด๋Š” ๋‚˜

์งง๊ฒŒ ์–˜๊ธฐํ•˜์ž๋ฉด this๋Š” ๋ˆ„๊ฐ€ ํ˜ธ์ถœํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

์–ด๋ ต๊ฒŒ๋งŒ ๋Š๊ปด์กŒ๋˜ this์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์ž.

 

๊ทธ๋ž˜์„œ this๋ž€??

์ผ๋‹จ this์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '์ด๊ฒƒ'์ด๊ธด ํ•œ๋ฐ.. ๋ญ˜ ๊ฐ€๋ฆฌํ‚ค๋Š๋ƒ.

๋ฐ”๋กœ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋‚˜ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋‹ค.

 

 

C++์ด๋‚˜ JAVA์™€ ๊ฐ™์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์—์„œ์˜ this๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋‹ค.

์ด๋ฏธ this๋ฅผ ์„ ์–ธํ•˜๋ฉด์„œ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ๊ฒฐ์ •๋œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this๋Š” ์ข€ ํŠน์ดํ•˜๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ this๋Š” ํ˜ธ์ถœ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ ๊ฒฐ์ •๋œ๋‹ค.

์ฆ‰, ๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๋ถ€๋ฅธ ๊ฒƒ์ธ๊ฐ€?? ์— ๋”ฐ๋ผ์„œ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

๋ˆ„๊ตฌ์ธ๊ฐ€? ๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๋ถˆ๋ €๋Š๋ƒ” ๋ง์ด์•ผ

์ด๋ ‡๊ฒŒ ์„ ์–ธ์ด ์•„๋‹Œ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด this๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿผ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ this๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”์ธ๋”ฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

 

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ this ๋ฐ”์ธ๋”ฉ

๊ฐ์ฒด ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ์˜ this

์—ฌ๊ธฐ์„œ์˜ this๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋‹ค.

const person = {
    name: "mimi",
    getName(){
        return this.name;
    }
}

console.log(person.getName()); // mimi

 

์ผ๋ฐ˜ ํ•จ์ˆ˜(์ค‘์ฒฉ, ์ฝœ๋ฐฑํ•จ์ˆ˜ ํฌํ•จ)์—์„œ์˜ this

์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์ผ ๋•Œ์˜ ์ „์—ญ๊ฐ์ฒด๋Š” window.

ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ค‘์ฒฉ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•˜๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•ด๋„ this๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

function hello(){
    console.log('hello -> this: ', this); // window

    function hi(){
        console.log('hi -> this: ', this); // window
    }
    hi();
}
hello();

์—ฌ๊ธฐ์„œ '์ผ๋ฐ˜ ํ•จ์ˆ˜'๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์˜€๋Š”๋ฐ, ES6 ๋ฌธ๋ฒ•์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this์™€๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—๋Š” ํ•จ์ˆ˜ ์ž์ฒด์˜ this ๋ฐ”์ธ๋”ฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•œ๋‹ค.

์ด ๋ถ€๋ถ„์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ธ€์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ์˜ this

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ๋ฐ”์ธ๋”ฉ๋œ HTML ์š”์†Œ๊ฐ€ this๋‹ค. (ํ˜ธ์ถœ์„ ์ด ์š”์†Œ๊ฐ€ ํ–ˆ์œผ๋‹ˆ๊นŒ~)

<button>button</button>
<script>
    const button = document.querySelector('button');
    button.addEventListener('click', function () {
        console.log(this); // <button>button</button>
    });
</script>

 

์ƒ์„ฑ์ž์—์„œ์˜ this

์ƒ์„ฑํ•  ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค(์ƒ์„ฑ๋œ ๊ฐ์ฒด)๊ฐ€ this๋‹ค.

function Person(name){
    this.name = name;
    this.getName = function(){
        return this.name;
    }
}

const person = new Person('mimi');
console.log(person.getName()); // mimi

์—ฌ๊ธฐ์„œ์˜ this๋Š” ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค, ์ฆ‰ person ์ž์‹ ์ด ๋˜๋Š” ๊ฑฐ๋‹ค.

ํ•˜์ง€๋งŒ new ํ‚ค์›Œ๋“œ๋ฅผ ๋นผ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ™์•„์ ธ์„œ window๊ฐ€ this๊ฐ€ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค!!

 

call(), apply(), bind()

๊ทธ๋ฆฌ๊ณ  call, apply, bind ๋ฉ”์„œ๋“œ๋กœ this๋ฅผ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

apply()์™€ call()

apply()์™€ call() ๋ฉ”์„œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๋‘˜์ด ๊ทธ๋Ÿผ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑด๊ฐ€ ์‹ถ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

apply() ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ฐ›์•„ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ฆ‰ ํ•จ์ˆ˜์—๊ฒŒ ๋ฐฐ์—ด์ด๋‚˜ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ฃผ๋กœ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์—์„œ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋ คํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

Call() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

 

bind()

bind ๋ฉ”์„œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž์— this๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค๋Š” ์ ์€ ๊ฐ™์ง€๋งŒ, ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ์›๋ณธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ!..

๋‚ด๋ถ€์˜ ์ค‘์ฒฉ ํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ this๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ ์“ฐ์ธ๋‹ค.

 

use strict ๋ชจ๋“œ์—์„œ์˜ this

use strict ๋ชจ๋“œ์—์„œ์˜ this๋„ ์ข€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

use strict ๋ชจ๋“œ์—์„œ๋Š” ํ•จ์ˆ˜ ๋‚ด์˜ this์— ๋””ํดํŠธ ๋ฐ”์ธ๋”ฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— undefined๋ผ๋Š” ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ!..

(function (){
    'use strict';

    function foo(){
        console.log(this); // undefined    
    }
    foo();

    function Foo(){
        console.log(this);  // Foo
    }
    new Foo();
}());

 

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this ๋˜ํ•œ ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

์—ฌ๊ธฐ์„œ์˜ this๋Š” ์ผ๋ฐ˜์ ์ธ this์™€ ๋‹ค๋ฅด๊ฒŒ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” this๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹  ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์Šค์ฝ”ํ”„์—์„œ์˜ this๋ฅผ ์ƒ์†ํ•œ๋‹ค. ์ฆ‰, ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. 

const myObj = {
  myMethod() {
    const myArrowFunction = () => {
      console.log(this); // myObj ๊ฐ์ฒด
    };
    myArrowFunction();
  }
};

myObj.myMethod(); // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ myObj ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค

 

 

 

์ฐธ๊ณ 

https://nykim.work/71

https://oneroomtable.tistory.com/entry/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-this๋ž€-๋Œ€์ฒด-๋ฌด์—‡์ผ๊นŒ

https://poiemaweb.com/js-this

 

 

 

 

 


๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ๐Ÿคธ‍โ™€๏ธ

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™Œ

ํฌ์ŠคํŒ…๋“ค์€ ๊ณต๋ถ€ ์ค‘์ธ ๋‚ด์šฉ์„ ๊ธ€๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋ผ ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 

๋ถ€์กฑํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ฝ”๋ฉ˜ํŠธ๋Š” ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค.

์ข‹์€ ํ•˜๋ฃจ ๋ณด๋‚ด์„ธ์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™‚

 

728x90