๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/JavaScript

[JavaScript / ES6] let, const์™€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

๋ฐ˜์‘ํ˜•

ES5๊นŒ์ง€ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅธ ํŠน์ง•์œผ๋กœ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š์œผ๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค.

  1. ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Function-level Scope)

    • ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์Šค์ฝ”ํ”„ ์ธ์ •. ๋”ฐ๋ผ์„œ ์ „์—ญ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค. ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋‚จ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ธ๋‹ค.
    • for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. var ํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ

    • ์•”๋ฌต์  ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋‚จ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
  3. ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ

    • ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜ ํ˜ผ๋ž€์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  4. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

    • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ด์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ES6๋Š” ์ด๋Ÿฌํ•œ var ํ‚ค์›Œ๋“œ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด let๊ณผ constํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜์˜€๋‹ค.

 

1. let

1.1 ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Block-level Scope)๋ฅผ ๋”ฐ๋ฅด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Function-level Scope)๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

ํ•จ์ˆ˜๋ ˆ๋ฒจ์Šค์ฝ”ํ”„(Function-level Scope)

ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์• ์…”๋งŒ ์œ ํšจ. ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

์ฆ‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋ฉฐ, ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค.

 

๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„(Block-level Scope)

๋ชจ๋“  ์ฝ”๋“œ๋ธ”๋ก(ํ•จ์ˆ˜, if ๋ฌธ, for ๋ฌธ, while ๋ฌธ, try/catch๋ฌธ ๋“ฑ) ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋„๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

์ฆ‰, ์ฝ”๋“œ ๋ธ”๋ก๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค.

 

์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

var foo = 123; // ์ „์—ญ๋ณ€์ˆ˜(1)
consolelog(foo); // 123

{
  var foo = 456; // ์ „์—ญ๋ณ€์ˆ˜(2)
}
console.log(foo); // 456

๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” var ํ‚ค์›Œ๋“œ์˜ ํŠน์„ฑ ์ƒ, ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์˜ ๋ณ€์ˆ˜ foo๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฏธ ์ „์—ญ๋ณ€์ˆ˜ foo๊ฐ€ ์„ ์–ธ๋˜์–ด์žˆ๊ณ  var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ค‘๋ณต ์„ ์–ธ์ด ํ—ˆ์šฉ๋˜๋ฏ€๋กœ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

๋‹จ, ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์˜ ๋ณ€์ˆ˜ foo(2)๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์—์„œ ์„ ์–ธ๋œ ์ „์—ญ๋ณ€์ˆ˜ foo(1)์˜ ๊ฐ’ 123์„ ์ƒˆ๋กœ์šด 456 ์œผ๋กœ ์žฌํ• ๋‹นํ•˜์—ฌ ๋ฎ์–ด์“ด๋‹ค.

 

let foo = 123; // ์ „์—ญ๋ณ€์ˆ˜
{
  let foo = 456; // ์ง€์—ญ๋ณ€์ˆ˜
  const bar = 456; // ์ง€์—ญ๋ณ€์ˆ˜
}
console.log(foo); // 123
console.log(bar); // ReferenceError: bar is not defined

let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ฝ”๋“œ๋ธ”๋ก๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜ foo ๋Š” ๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค. ์ „์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ foo์™€๋Š” ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ๋ณ€์ˆ˜์ด๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜ bar๋„ ๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ „์—ญ์—์„œ๋Š” ๋ณ€์ˆ˜ bar๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

 

 

1.2 ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ๊ธˆ์ง€

var ํ‚ค์›Œ๋“œ๋กœ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ let ํ‚ค์›Œ๋“œ๋Š” ๋™์ผํ•œ ์ด๋ฆ„ ๊ฐ–๋Š” ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต์„ ์–ธํ•˜๋ฉด ๋ฌธ๋ฒ•์—๋Ÿฌ(SyntaxError)๊ฐ€ ๋ฐœ์ƒ.

var foo = 123; 
var foo = 456; // ์ค‘๋ณต์„ ์–ธํ—ˆ์šฉ

let bar = 123;
let bar = 456; // ๋ฌธ๋ฒ•์—๋Ÿฌ

 

 

1.3 ํ˜ธ์ด์ŠคํŒ…

ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด๋ž€ var์„ ์–ธ๋ฌธ์ด๋‚˜ function์„ ์–ธ๋ฌธ ๋“ฑ์„ ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ์˜ฎ๊ธด ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ์„ ๋งํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ES6์—์„œ ๋„์ž…๋œ let, const๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์„ ์–ธ์„ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋˜ ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๋ฌธ ์ด์ „์— ์ฐธ์กฐํ•˜๋ฉด ์ฐธ์กฐ์—๋Ÿฌ(ReferenceError)๊ฐ€ ๋ฐœ์ƒ.

์ด๋Š” letํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘์—์„œ ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊นŒ์ง€ ์ผ์‹œ์ ์‚ฌ๊ฐ์ง€๋Œ€(Temporal Dead Zone;TDZ)์— ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ.

console.log(foo); // undefined
var foo;

console.log(bar); // Error: Uncaught ReferenceError: bar is not defined
let bar;

 

๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋ฉฐ ํ˜ธ์ด์ŠคํŒ…์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

๋ณ€์ˆ˜๋Š” 3๋‹จ๊ณ„์— ๊ฑธ์ณ ์ƒ์„ฑ๋œ๋‹ค.

์„ ์–ธ๋‹จ๊ณ„ (Declaration phase)

๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜๊ฐ์ฒด(variable Object)์— ๋“ฑ๋ก. ์ด ๋ณ€์ˆ˜๊ฐ์ฒด๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์ด ๋œ๋‹ค.

์ดˆ๊ธฐํ™”๋‹จ๊ณ„ (Initialization phase)

๋ณ€์ˆ˜๊ฐ์ฒด(variable Object)์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋ฉ”๋ชจ๋ฆฌ์— ํ™•๋ณด. ์ด ๋‹จ๊ณ„์— ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”.

ํ• ๋‹น๋‹จ๊ณ„ (Assignment phase)

undefined๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜์— ์‹ค์ œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

 

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™”๋‹จ๊ณ„๊ฐ€ ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง„๋‹ค.

์ฆ‰, ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋ก(์„ ์–ธ๋‹จ๊ณ„)ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ ํ›„, undefined๋กœ ์ดˆ๊ธฐํ™”(์ดˆ๊ธฐํ™”๋‹จ๊ณ„) ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜์—ฌ๋„ ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋งŒ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ›„ ๋ณ€์ˆ˜ํ• ๋‹น๋ฌธ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.

์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ๋ณ€์ˆ˜ํ˜ธ์ด์ŠคํŒ…(Variable Hoisting)์ด๋ผ ํ•œ๋‹ค.

// ์Šค์ฝ”ํ”„์˜ ์„ ๋‘์—์„œ ์„ ์–ธ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™”๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
// ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜์„ ์–ธ๋ฌธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
console.log(foo); // undefined

var foo;
console.log(foo); // undefined

foo = 1; // ํ• ๋‹น๋ฌธ์—์„œ ํ• ๋‹น๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰.
console.log(foo); // 1

 


let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋œ๋‹ค.

์ฆ‰, ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋ก(์„ ์–ธ๋‹จ๊ณ„)ํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ด๋ฃจ์–ด์ง„๋‹ค.

// ์Šค์ฝ”ํ”„์˜ ์„ ๋‘์—์„œ ์„ ์–ธ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰.
// ์•„์ง ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”(๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณด์™€ undefined๋กœ ์ดˆ๊ธฐํ™”)๋˜์ง€ ์•Š์•˜๋‹ค.
console.log(foo); // undefined

let foo; // ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰.
console.log(foo); // undefined

foo = 1; // ํ• ๋‹น๋ฌธ์—์„œ ํ• ๋‹น๋‹จ๊ณ„ ์‹คํ–‰.
console.log(foo); // 1
  ์„ ์–ธ๋‹จ๊ณ„ ReferenceError
  ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ) ReferenceError
let foo; ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ foo === undefined
foo = 1; ํ• ๋‹น๋‹จ๊ณ„ foo === 1

 

๊ฒฐ๊ตญ ES6์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

let foo = 1; // ์ „์—ญ๋ณ€์ˆ˜
{
  console.log(foo); // ReferenceError: foo is not undefined
  let foo = 2; // ์ง€์—ญ๋ณ€์ˆ˜
}

ES6์˜ ์„ ์–ธ๋ฌธ๋„ ์—ฌ์ „ํžˆ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ์—๋Ÿฌ(ReferenceError)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ES6์˜ let์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜foo๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค. (let foo = 2;) ๋”ฐ๋ผ์„œ ์ง€์—ญ๋ณ€์ˆ˜foo๋„ ํ•ด๋‹น ์Šค์ฝ”ํ”„์—์„œ ํ˜ธ์ด์ŠคํŒ…๋˜๊ณ  ์ฝ”๋“œ ๋ธ”๋ก์˜ ์„ ๋‘๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€์ ๊นŒ์ง€ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ)์— ๋น ์ง„๋‹ค.

๋”ฐ๋ผ์„œ ์ „์—ญ๋ณ€์ˆ˜foo์˜ ๊ฐ’์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ์—๋Ÿฌ(ReferenceError)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฝ”๋“œ๋ธ”๋ก๋‚ด์— ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์–ด console.log(foo)๋ฅผ ์ฝ์ง€๋งŒ ์ผ์‹œ์ ์‚ฌ๊ฐ์ง€๋Œ€์— ๋น ์ง€๋ฏ€๋กœ ๋ ˆํผ๋Ÿฐ์Šค ์—๋Ÿฌ๊ฐ€ ๋‚œ ๊ฒƒ์ด๋‹ค.

์ง€์—ญ๋ณ€์ˆ˜ ์•„๋ž˜์— console.log(foo); ๋ฅผ ํ™•์ธํ•˜๋ฉด 2๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

1.4 ํด๋กœ์ €

๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•˜๋Š” let์€ var๋ณด๋‹ค ์ง๊ด€์ ์ด๋‹ค.

var funcs = [];

// ํ•จ์ˆ˜์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” for ๋ฃจํ”„์˜ i๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค.
for(var i = 0; i < 3; i++) {
  funcs.push(function() { console.log(i); });
}

// ๋ฐฐ์—ด์—์„œ ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์–ด ํ˜ธ์ถœํ•œ๋‹ค.
for(var j = 0; j < 3; j++) {
  funcs[j]();
}

0, 1, 2๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๊ฒƒ์ด ์•„๋‹Œ 3์ด ์„ธ ๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” for ๋ฃจํ”„์˜ var i๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

var funcs = [];

// ํ•จ์ˆ˜์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” for ๋ฃจํ‘ธ์˜ i๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค.
for(var i = 0; i < 3; i++) {
  (function(index) { // index๋Š” ์ž์œ ๋ณ€์ˆ˜์ด๋‹ค.
    funcs.push(function() { console.log(index); });
  })(i);
}

// ๋ฐฐ์—ด์—์„œ ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์–ด ํ˜ธ์ถœํ•œ๋‹ค.
for(var j = 0; j < 3; j++) {
  funcs[j]();
}

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋กœ ์ธํ•˜์—ฌ for๋ฃจํ”„์˜ ์ดˆ๊ธฐํ™”์‹์— ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๊ฐ€ ์ „์—ญ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ฒŒ ๋˜์–ด 0,1,2๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. (ํด๋กœ์ € ํ™œ์šฉ)

ES6์˜ letํ‚ค์›Œ๋“œ๋ฅผ for๋ฃจํ”„์˜ ์ดˆ๊ธฐํ™”์‹์— ์‚ฌ์šฉํ•˜๋ฉด ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์œ„ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋™์ž‘์„ ํ•œ๋‹ค.

var funcs = [];

// ํ•จ์ˆ˜์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” for๋ฃจํ‘ธ์˜ i๋Š” for๋ฃจํ”„์˜ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ๋งŒ ์œ ํšจํ•œ ์ง€์—ญ๋ณ€์ˆ˜์ด๋ฉด์„œ ์ž์œ ๋ณ€์ˆ˜์ด๋‹ค.
for(let i = 0; i < 3; i++) {
  funcs.push(function() { console.log(i); });
}

// ๋ฐฐ์—ด์—์„œ ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์–ด ํ˜ธ์ถœํ•œ๋‹ค.
for(var j = 0; j < 3; j++) {
  console.dir(funcs[j]);
  funcs[j]();
}

for๋ฃจํ”„์˜ let i๋Š” for loop์—์„œ๋งŒ ์œ ํšจํ•œ ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค.

๋˜ํ•œ, i๋Š” ์ž์œ ๋ณ€์ˆ˜๋กœ์„œ for๋ฃจํ‘ธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋ณ€์ˆ˜ i๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ ๊ณ„์† ์œ ์ง€๋œ๋‹ค.

 

 

1.5 ์ „์—ญ๊ฐ์ฒด์™€ let

์ „์—ญ๊ฐ์ฒด(Global Object)๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์œ ์ผํ•œ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Browser-side์—์„œ๋Š” window ๊ฐ์ฒด, Server-side(Node.js)์—์„œ๋Š” global ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.

var foo = 123; // ์ „์—ญ๋ณ€์ˆ˜
console.log(window.foo); // 123

 

let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, let ์ „์—ญ๋ณ€์ˆ˜๋Š” ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ฆ‰, window.foo์™€ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

let ์ „์—ญ๋ณ€์ˆ˜๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๊ฐœ๋…์ ์ธ ๋ธ”๋ก ๋‚ด์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

let foo = 123; // ์ „์—ญ๋ณ€์ˆ˜
console.log(window.foo); // undefined

 

 

2. const

let์€ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‚˜ const๋Š” ์žฌํ• ๋‹น์ด ๊ธˆ์ง€๋‹ค.

const FOO = 123;
FOO = 456; // TypeError: Assignment to constant variable.

 

์ฃผ์˜ํ•  ์ ์€

const๋Š” ๋ฐ˜๋“œ์‹œ ์„ ์–ธ + ํ• ๋‹น์ด ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

const FOO; // SyntaxError: Missing initializer in const declaration

 

๋˜ํ•œ, const๋Š” let๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ธ”๋ก๋ ˆ๋ฒจ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค.

{
  const FOO = 10;
  console.log(FOO); // 10
}
console.log(FOO); // ReferenceError: FOO is not defined

 

 

2.2 ์ƒ์ˆ˜

์ƒ์ˆ˜๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

// 10์˜ ์˜๋ฏธ๋ฅผ ์•Œ๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.
if(row > 10) {}

// ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ๊ธฐ์ˆ ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.
const MAXROWS = 10;
if(rows > MAXROWS) {}

์กฐ๊ฑด๋ฌธ ๋‚ด์˜ 10์€ ์–ด๋–ค ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•˜์˜€๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ๊ณค๋ž€ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋„ค์ด๋ฐ์ด ์ ์ ˆํ•œ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.

 

const๋Š” ๊ฐ์ฒด์—๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋•Œ๋„ ์žฌํ• ๋‹น์€ ๊ธˆ์ง€๋œ๋‹ค.

const obj = { foo : 123 };
obj = { bar : 456 }; // TypeError: Assignment to constant variable.

 

 

2.3 const์™€ ๊ฐ์ฒด

const๋Š” ์žฌํ• ๋‹น์ด ๊ธˆ์ง€๋œ๋‹ค.

์ด๋Š” const ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ๊ฐ์ฒด์•  ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ. ํ•˜์ง€๋งŒ ์ด๋•Œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š”๋‹ค.

์žฌํ• ๋‹น์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‚˜ ํ• ๋‹น๋œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ(ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€, ์‚ญ์ œ, ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๋ณ€๊ฒฝ)์€ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๋‹ค.

 

const user = { name: 'Lee' };

// const ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๊ธˆ์ง€.
// user = {}; // TypeError: Assignment to constant variable.

// ๊ฐ์ฒด์˜ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
user.name = 'Kim';

console.log(user); // { name: 'Kim' }

๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๊ฐ์ฒดํƒ€์ž…๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ์ฃผ์†Œ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ์ฒดํƒ€์ž… ๋ณ€์ˆ˜ ์„ ์–ธ์—๋Š” const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋งŒ์•ฝ์— ๊ฐ์ฒดํƒ€์ž… ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€๊ฒฝ(์žฌํ• ๋‹น)ํ•  ๊ฒฝ์šฐ๋Š” let์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

3. var vs let vs const

๋ณ€์ˆ˜ ์„ ์–ธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ const ์‚ฌ์šฉํ•˜๊ณ , let์€ ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•œ์ •ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์›์‹œ ๊ฐ’์ผ ๊ฒฝ์šฐ, ๊ฐ€๊ธ‰์  const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋ฅผ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ํ”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— constํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์˜๋„์น˜ ์•Š์€ ์žฌํ• ๋‹น์„ ๋ฐฉ์ง€ํ•ด์ฃผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋‹ค.

  • ES6๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด var ํ‚ค์›Œ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•œ์ •ํ•ด let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ์ตœ๋Œ€ํ•œ ์ข๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”(์žฌํ• ๋‹น์ด ํ•„์š”์—†๋Š” ์ƒ์ˆ˜)์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด์—๋Š” const๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. constํ‚ค์›Œ๋“œ๋Š” ์žฌํ• ๋‹น ๊ธˆ์ง€ํ•˜๋ฏ€๋กœ var, let ๋ณด๋‹ค ์•ˆ์ „ํ•˜๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์‹œ์ ์—๋Š” ์žฌํ• ๋‹น์ด ํ•„์š”ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋Š” ์˜์™ธ๋กœ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ์—๋Š” ์ผ๋‹จ cosnt ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

์žฌํ• ๋‹น์ด ํ•„์š”ํ•˜๋‹ค๋ฉด(๋ฐ˜๋“œ์‹œ ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ์ง€ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๊ธฐ) ๊ทธ๋•Œ const๋ฅผ let ํ‚ค์›Œ๋“œ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๋Šฆ์ง€ ์•Š๋‹ค.

 

 


 

Reference

https://poiemaweb.com/es6-block-scope

 

๋ฐ˜์‘ํ˜•