์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[JavaScript] ์™„๋ฒฝ๊ฐ€์ด๋“œ Hoisting

Coding/JS

by hwlink 2022. 2. 20. 00:53

๋ณธ๋ฌธ

๐Ÿ“Œ ํ˜ธ์ด์ŠคํŒ…

JavaScript์—์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ undefined๋กœ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜ธ์ด์ŠคํŒ… ์‹œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -MDN


ํ˜ธ์ด์ŠคํŒ…์„ ์ดํ•ด ํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„(block scope) ์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. ๋ณ€์ˆ˜ ์œ ํšจ๋ฒ”์œ„

ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ์˜์—ญ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ์œ ํšจ๋ฒ”์œ„๋Š” ๋ณ€์ˆ˜๋ฅผ ์–ด๋””์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.


  1. ์ „์—ญ๋ณ€์ˆ˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์ „์ฒด์— ๊ฑธ์ณ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์–ด๋–ค ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง ํ•ด๋‹น ํ•จ์ˆ˜ ๋ชธ์ฒด ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ง€์—ญ๋ณ€์ˆ˜์ด๋ฉฐ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ ๋‚ด์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฆ„์ด ๊ฐ™์„ ๊ฒฝ์šฐ์— ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ฐ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.)




์ „์—ญ๋ณ€์ˆ˜ ์ง€์—ญ๋ณ€์ˆ˜ ์ฝ”๋“œ

var scope = "์ „์—ญ๋ณ€์ˆ˜"; // ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
function checkscope(){
  var scope = "์ง€์—ญ๋ณ€์ˆ˜"; // ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  return scope;
}

checkscope();




ํ•จ์ˆ˜ ์ •์˜๋Š” ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜์—๋Š” ์ž์‹ ๋งŒ์˜ ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var scope = "์ „์—ญ๋ณ€์ˆ˜";
function checkscope(){
  var scope = "์ง€์—ญ๋ณ€์ˆ˜";
      function nested(){
          var scope = "์ค‘์ฒฉ๋ณ€์ˆ˜"; // ํ•จ์ˆ˜ ์•ˆ์— ํฌํ•จ๋œ ์œ ํšจ๋ฒ”์œ„์˜ ์ง€์—ญ ๋ณ€์ˆ˜
        return scope;
      }
  return nested();
}
checkscope();    // "์ค‘์ฒฉ๋ณ€์ˆ˜" ๋ฆฌํ„ด



2. ํ•จ์ˆ˜ ์œ ํšจ๋ฒ”์œ„์™€ ํ˜ธ์ด์ŠคํŒ…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ๋ธ”๋ก๋‚ด์— ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋ธ”๋ก๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” *๋ธ”๋ก ๋ฐ”๊นฅ์—์„œ๋Š” ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋Š” C๊ฐ™์€ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ๋ธ”๋ก ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„  ๋ธ”๋ก์ด ๋‹ซํžŒ ์ดํ›„์—๋„ ์•„๋ž˜์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

*๋ธ”๋ก:์ฝ”๋“œ ๋‚ด์—์„œ ์ค‘๊ด„ํ˜ธ({})๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

{
  var i = 1
}
console.log(i)  /// 1




๋‹ค๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

function test(o) {
  var i = 0;
  if (o) {
    var j = 0;
    for (var k = 0; k < 10; k++) {
      console.log("for", k);
    }
    console.log("k", k);
  }
  console.log("j", j);
}

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋Š” ์œ„ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ์ „์ฒด์— ๊ฑธ์ณ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ˜ธ์ด์ŠคํŒ…์ด ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


var scope="global";
function f (){
  1๏ธโƒฃ console.log(scope); //'undefined' ํ˜ธ์ด์ŠคํŒ… ์ดˆ๊ธฐํ™”
  2๏ธโƒฃ var scope ="local";
    3๏ธโƒฃ console.log(scope); // 'local'
}

์ฒ˜์Œ์—๋Š” ์œ„ ์ฝ”๋“œ์—์„œ f ํ•จ์ˆ˜ ์•ˆ์— 1๏ธโƒฃ์ด ์ „์—ญ๋ณ€์ˆ˜์ธ "global"์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 'undefined'๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๋‚ด์— ํ•จ์ˆ˜ ์ „์ฒด์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” 2๏ธโƒฃ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ์ง€์—ญ๋ณ€์ˆ˜ 1๏ธโƒฃ ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ๋Š”๋ฐ 'undefined'๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ•จ์ˆ˜ ๋งจ ๊ผญ๋•Œ๊ธฐ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ฃผ๋Š” ํ˜ธ์ด์ŠคํŒ… ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝ์—์„  ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

var scope = "global";
function f() {
  var scope;
  console.log(scope); //'undefined'
  scope = "local";
  console.log(scope); // 'local'
}

์ฐธ๊ณ 

  • MDN Hoisting
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์™„๋ฒฝ๊ฐ€์ด๋“œ(๋ฐ์ด๋น„๋“œ ํ”Œ๋ž˜๋„ˆ๊ฑด)

ํ•ด๋‹น ๊ธ€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์™„๋ฒฝ๊ฐ€์ด๋“œ(๋ฐ์ด๋น„๋“œ ํ”Œ๋ž˜๋„ˆ๊ฑด), ์›น์‚ฌ์ดํŠธ ๋“ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

'Coding > JS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] ์Œ์ˆ˜๋กœ ๋ฐฐ์—ด์ ‘๊ทผ array.prototype.at()  (0) 2022.04.27
[JavaScript] JSON, Javascript Object  (0) 2022.04.24
[JavaScript] Syntactic Sugar  (0) 2022.01.09
[JavaScript] JS DOM  (0) 2022.01.02
[JavaScript] Runtime Stack, Queue, Eventloop  (0) 2021.12.31

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ