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

JS_๊ธฐ์ˆ  (3)_ Hoisting(ํ˜ธ์ด์ŠคํŒ…) ๋ฟŒ์ˆ˜๊ธฐ

by KASSID 2023. 3. 31.

๋ชฉ์ฐจ

    728x90

    JS์˜ ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜๋‹ค!

     

    1. ํ˜ธ์ด์ŠคํŒ…์ด๋ž€?

    ( 1 ) ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ

    JavaScript์—์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 
    - MDN (https://developer.mozilla.org/ko/docs/Glossary/Hoisting)

    MDN ๋ฌธ์„œ์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ๋ฒˆ์—ญ์„ ํ•˜์˜€๋‹ค.

     

    ์ฆ‰, JS์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ์„ ๋ชจ๋‘ ๋ฏธ๋ฆฌ ํ• ๋‹น์„ ํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

     

    ๊ธ€์˜ ๋ณธ๊ฒฉ์ ์ธ ์‹œ์ž‘์— ์•ž์„œ

    ๋ชจ๋“  ์‹๋ณ„์ž(๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ)๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋œ๋‹ค!

     


    ( 2 ) var์˜ ํŠน์ง•

    JS์—์„œ ๋ณ€์ˆ˜, ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

    1.var    2.let    3. const

    ์ด ์ค‘ const๋Š” ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  var๊ณผ let์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ? ํ˜ธ์ด์ŠคํŒ…์˜ ๊ด€์ ์—์„œ ์•Œ์•„๋ณด์ž

     

    ์˜ˆ์‹œ 1) var

    console.log(a);
    var a = 1;
    
    >>> undefined

    ์˜ˆ์‹œ 2) let

    console.log(a);
    let a = 1;
    
    >>> Uncaught ReferenceError: a is not defined

    ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด var๋ฅผ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์ง€๋งŒ let์€ ์ฐธ์กฐ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด๋Š” var๊ณผ let์˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

     


    ( 3 ) JS ์ฝ”๋“œ ์‹คํ–‰์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค

    1) Execution Context (์‹คํ–‰ ์ปจํ…์ŠคํŠธ)

    Execution Context๋Š” JS์—์„œ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜ํ–‰ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

    An execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation. 

    - ECMAScript(262) 9.4 Execution Contexts

    ์ฆ‰, ECMAScripts์—์„œ ์ฝ”๋“œ ์ˆ˜ํ–‰(evaluation) ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

     

    2) Lexical Environment

    ์œ„์˜ Execution Context์— ์†ํ•ด์žˆ๋Š” ์š”์†Œ์ด๊ณ ,

    ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

    ์ฆ‰, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ ์ด์ „์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    ์ด๋กœ์ธํ•ด '์ฝ”๋“œ์˜ ์œ„์ชฝ์œผ๋กœ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋“ค์ด ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค!' ๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    Lexical Environment์˜ ๊ตฌ์กฐ๋Š” ์‹๋ณ„์ž์™€ ๊ฐ’์˜ ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

    // ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•œ ์˜ˆ์‹œ
    lexicalEnvironment = {
      Identifier : value,
      Identifier : <Function>,
      ...
    }

     

    ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋ฉด

    say();
    
    function say(){
      console.log('Hello');
    }

    ์œ„์™€ ๊ฐ™์ด ์„ ์–ธ๋ถ€๊ฐ€ ํ˜ธ์ถœ๋ถ€๋ณด๋‹ค ๋จผ์ € ์œ„์น˜ํ•ด ์žˆ๋”๋ผ๋„

    lexicalEnvironment = {
      say : <Function>,
    }

    Lexical Environment์— ์ €์žฅ์ด ๋˜๊ณ 

    ์ฝ”๋“œ ์‹คํ–‰ ์‹œ say()๋ผ๋Š” ํ˜ธ์ถœ๋ถ€๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ์ด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

     


    ( 4 ) var์˜ ํ˜ธ์ด์ŠคํŒ…

    var์€ ์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด ๋‹ค๋ฅธ ์„ ์–ธ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๋‹ค.

    Scope์˜ ๊ฐœ๋…๋„ ๋ชจํ˜ธํ•˜๊ณ , ํ˜ธ์ด์ŠคํŒ…์„ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

     

    ์ด๋Ÿฌํ•œ ํŠน์ง•์˜ ์›์ธ์€ ๋ฐ”๋กœ Lexical Environment์— ์ €์žฅ์ด ๋˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ์ด๋‹ค.

     

    ์ •๋‹ต๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด var๋กœ ์„ ์–ธ๋œ ๋Œ€์ƒ์€ ๊ทธ ์ฆ‰์‹œ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋œ๋‹ค.

    ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ•œ ๊ฐ€์ง€ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๋” ์•Œ์•„๋ณด์ž.

     


    ( 5 ) Temporal Dead Zone; TDZ

    TDZ๋Š” ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋“ค์ด ์„ ์–ธ์ด ๋˜์–ด Lexical Environment์— ์ €์žฅ๋œ ํ›„ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ธฐ ์ „๊นŒ์ง€์˜ ์ฃฝ์€ ์กด์„ ๋งํ•œ๋‹ค.

    ์ฆ‰, ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ์‚ฌ์ด์˜ ์ผ์‹œ์ ์œผ๋กœ ์ฃฝ์€ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

     

    ํฌ์ธํŠธ๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ์‚ฌ์ด์ธ๋ฐ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ var์€ ์„ ์–ธ ์ฆ‰์‹œ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

    ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์„ ์–ธ๋“ค์€ ๋ชจ๋‘ uninitialized ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

     

    ์˜ˆ์‹œ)

    console.log(a);
    var a = 1;
    
    
    console.log(b);
    let b = 2;

     

    lexicalEnvironment{
      a : undefined,
      b : <uninitialized>,
    }

    ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์ด๋‹ค.

     

    undefined๋Š” ์‹ค์งˆ์ ์ธ ๊ฐ’์œผ๋กœ ์ธ์‹ํ•˜์ง€๋งŒ

    uninitialized๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

     


    2. ํ‘œํ˜„์‹๋“ค์€ ํ˜ธ์ด์ŠคํŒ…์ด ์•ˆ๋œ๋‹ค!

    ์„ ์–ธ์„ ๊ณง๋ฐ”๋กœ ํ•˜์ง€์•Š๊ณ  ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋‚˜ ํด๋ž˜์Šค ํ‘œํ˜„์‹์€ ํ˜ธ์ด์ŠคํŒ…์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

    var๊ณผ ๊ด€๊ณ„์—†์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

     

    ์˜ˆ์‹œ)

    a();
    
    var a = function(){
      console.log('Hello');
    }
    
    >>> Uncaught TypeError: a is not a function

    ์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ถœ์„ ๋จผ์ €ํ•  ๊ฒฝ์šฐ TypeError๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ var ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์—ˆ์ง€๋งŒ

    a()๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ์š”์ฒญํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— TypeError๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ํด๋ž˜์Šค ํ‘œํ˜„์‹๋„ ๋™์ผํ•œ ์ด์œ ๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

     

     

     

     


    ์ตœ์ข… ์ •๋ฆฌ

    ๋ชจ๋“  ์‹๋ณ„์ž๋“ค(๋ณ€์ˆ˜, ํ•จ์ˆ˜ ํด๋ž˜์Šค)์€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•œ๋‹ค!

     

    ํ•˜์ง€๋งŒ

    var์€ undefined๋ผ๋Š” ๊ฐ’์œผ๋กœ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ ,

     

    ๋‚˜๋จธ์ง€ let, const ๋“ฑ์€ uninitialized๋ผ๋Š” ๊ฐ’์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด

    TDZ์— ๋น ์ง€๊ณ  ReferenceError๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ๋˜ํ•œ ํ•จ์ˆ˜ํ‘œํ˜„์‹, ํด๋ž˜์Šค ํ‘œํ˜„์‹์€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค!

     

     

     

    ์ถœ์ฒ˜

    https://blinders.tistory.com/90

    https://dkje.github.io/2020/08/30/ExecutionContext/

    https://meetup.nhncloud.com/posts/129

    https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

    ๋Œ“๊ธ€