๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/Vanilla JS

JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ• (27)_ this ํ‚ค์›Œ๋“œ

by KASSID 2023. 8. 1.

๋ชฉ์ฐจ

    728x90

    JS์˜ this ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. (4๊ฐ€์ง€)

     

    0. this ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ

    this ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์–‘ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    ๊ทธ ์˜๋ฏธ๋Š” ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. (์‚ฌ์‹ค ์•„๋‹์ˆ˜๋„..?)

     

     

    1-1. global์—์„œ ์‚ฌ์šฉ & ์ผ๋ฐ˜(์ „์—ญ) ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ -> window

    ๋จผ์ € ๊ฐ€์žฅ ์ƒ์œ„ ์œ„์น˜์—์„œ this ํ‚ค์›Œ๋“œ๋ฅผ ์ฝ˜์†”์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    window๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    +) window๋ž€?

    - ๋ชจ๋“  ์ „์—ญ๋ณ€์ˆ˜, ํ•จ์ˆ˜, DOM์„ ๊ด€๋ฆฌํ•˜๋Š” ์ „์—ญ๊ฐ์ฒด!

    - ์˜ˆ๋ฅผ๋“ค์–ด ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด window ์•ˆ์— ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

     

     

    1-2. strict mode์ผ๋•Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‚ฌ์šฉ -> undefined

    'use strict'

    'use strict'๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ตœ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•˜๋ฉด strict ๋ชจ๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    strict ๋ชจ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

    ์˜ˆ๋ฅผ ๋“ค์–ด let ๋“ฑ์˜ ํ‚ค์›Œ๋“œ ์—†์ด ๋ณ€์ˆ˜ ์„ ์–ธ ๋“ฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ํ•ด๋‹น ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด

    undefined๋ผ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

     

     


    2. object ๋‚ด๋ถ€ ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)์—์„œ this ->  ๋ถ€๋ชจ

    ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ this๋Š” '๋ถ€๋ชจ'๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, ํ˜„์žฌ ์†ํ•œ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

     

    1_๋ฉ”์†Œ๋“œ์—์„œ this

    ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ์—์„œ this๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    2_ํ•œ๋‹จ๊ณ„ ๋”?

    ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋„ ์—ญ์‹œ ๋ถ€๋ชจ๋ฅผ ์˜๋ฏธํ•˜๋Š”

    obj.hello๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋‹ค๋ฅธ๋ฐฉ๋ฒ• โ–ผ

     

     

    ๋”๋ณด๊ธฐ

     ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•๋„ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     


    ์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€

    window ์—ญ์‹œ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋‚ด๋ถ€์—์„œ this๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด

    ๊ทธ๊ฒƒ์ด ์†ํ•ด์žˆ๋Š” ๊ฐ์ฒด์ธ window๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

     

    ๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜‘๊ฐ™์€ window๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    function hello(){
      console.log(this);
    }
    
    window.hello = function(){console.log(this)};

     

     

     

    ์ •๋ฆฌํ•˜์ž๋ฉด,

    this๋Š” ๊ฐ์ฒด ๋‚ด์˜ ๋ฉ”์†Œ๋“œ(ํ•จ์ˆ˜)์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์†Œ๋“œ์˜ ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

     

     


    3. constructor ์•ˆ์—์„œ this -> ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค

    JS์—์„œ ๋น„์Šทํ•œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„๋•Œ constructor๋ฅผ ์ด์šฉํ•œ๋‹ค.

     

    ์˜ˆ์‹œ

    function Apple(){
      this.author = "Kassid";
    }

     

    ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” this๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋  ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

     

    ์œ„์ฒ˜๋Ÿผ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์— ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    4. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ this -> e.currentTarget

    ์š”์†Œ์— ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ this๋Š” e.currentTarget๊ณผ ์˜๋ฏธ๊ฐ€ ๋™์ผํ•˜๋‹ค.

     

    ์˜ˆ์‹œ

    <div class="box" style="width: 100px; height: 100px; background: #efefef;"></div>
    <script>
    document.getElementsByClassName("box")[0].addEventListener("click", function(e){
      console.log(this);
      console.log(e.currentTarget);
    })
    </script>

     

     

    ์ด์ฒ˜๋Ÿผ ๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

     


    Q1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์•ˆ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ this -> window

     

    ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์•ˆ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ this๋Š” ์–ด๋–ค ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ• ๊นŒ?

     

    ์˜ˆ์‹œ

    document.getElementsByClassName("box")[0].addEventListener("click", function(e){
      let arr = [1,2,3];
      arr.forEach(function(a){
        console.log(this);
      })
    })

     

     

    ์ด์ฒ˜๋Ÿผ window๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์œ„์—์„œ ๋ณด์•˜๋˜ 4๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ฐ์ ธ๋ณด์•˜์„๋•Œ

    3๋ฒˆ์ธ constructor๊ฐ€ ์•„๋‹ˆ๊ณ ,

    4๋ฒˆ์ธ eventListener๋Š” ๋ฌผ๋ก  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์•ˆ์— ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๊ทธ ๋‚ด๋ถ€์˜ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ๋‚ด๋ถ€์ด๋ฏ€๋กœ 4๋ฒˆ๋„ ์•„๋‹ˆ๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด 1, 2๋ฒˆ์˜ ๊ฒฝ์šฐ์ธ๋ฐ

    ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ๊ทธ์ € ์ผ๋ฐ˜ํ•จ์ˆ˜์ด๋ฏ€๋กœ

    window๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

     

    Q2. ๊ฐ์ฒด ๋‚ด์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ this -> window

     

    ์ด๋ฒˆ์—๋Š” ๊ฐ์ฒด ๋‚ด์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ this๋Š” ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ์ง€ ์•Œ์•„๋ณด์ž.

    let obj = {
      arr : [1,2,3],
      func : function(){
        obj.arr.forEach(function(a){
          console.log(this)
        })
      }
    }
    obj.func()

     

     

    ์—ญ์‹œ window๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ๊ทธ ์ด์œ ๋Š” this๊ฐ€ ์†ํ•œ ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๋ฉด ๋˜๋Š”๋ฐ ์—ญ์‹œ ์ผ๋ฐ˜ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ์˜ ๋ถ€๋ชจ์ธ window๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

     

    Q3. arrow function ์•ˆ์—์„œ์˜ this

    ์ด๋ฒˆ์—๋Š” arrow function์—์„œ this๋ฅผ ์•Œ์•„๋ณด์ž.

    let c = {
    	func: function(){
            let a = [1];
            a.forEach(()=>{
                console.log(this);
            })
        }
    }
    
    c.func()

     

     

    Q2์˜ ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅด๊ฒŒ ์ด๋ฒˆ์—๋Š”  c.func๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    ์ด๋Š” arrow function์˜ ํŠน์ง•์œผ๋กœ,

    ์ผ๋ฐ˜ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ๋…๋ฆฝ์ ์ธ ๊ฒƒ์ด ์•„๋‹Œ

    ํ•ด๋‹น ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ this์™€ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    let c = {
    	func: function(){
        	console.log(this); //์™ธ๋ถ€์˜ this
            let a = [1];
            a.forEach(()=>{
                console.log(this); //๋‚ด๋ถ€์˜ this
            })
        }
    }
    
    c.func()

     

     

     


    ์ง€๊ธˆ๊นŒ์ง€ this์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

     

    this๋Š” ๊ทธ๊ฒƒ์ด ์œ„์น˜ํ•˜๋Š” ๊ณณ๊ณผ ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ๊ฒƒ์„ ์—ผ๋‘ํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

    ๋”ฐ๋ผ์„œ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ช…์‹œ์ ์ธ ๋ฐฉ๋ฒ•์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

     

    ๋Œ“๊ธ€