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

๐Ÿ“ฐ ์–ธ์–ด/JS - ๋น„๊ธฐ๋„ˆ ํŽธ

๋ณ€์ˆ˜ ์„ ์–ธ (var, let, const)

1. ๋ณ€์ˆ˜ ์„ ์–ธ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

1) var ( function scope, mutable )

๋˜๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ! 

# ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”
var i;  // ์„ ์–ธ, "undefined"๊ฐ€ ์ €์žฅ๋จ
var sum = 0;  // ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”

# ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ
var i, sum; 

# ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋™์‹œ์— ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ
var i=0, sum=10, message=”Hello”;  

# ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋จ
name = "javascript";   

var์˜ ๋ฌธ์ œ์ 

  1. ๋ณ€์ˆ˜์˜ ์ •์˜๋ฅผ ์œ„์ชฝ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ(๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…) ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ ์ „์— ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 
  2. ๋ธ”๋ก ๋‹จ์œ„๋ฅผ ์ฒ ์ €ํžˆ ๋ฌด์‹œํ•˜๋Š” ํ•จ์ˆ˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. 
  3. var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์žฌ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค.
  4. ํ•จ์ˆ˜์•ˆ์—์„œ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค. (๊ธ€๋กœ๋ฒŒํ•œ ๋ณ€์ˆ˜๋“ค์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ๋ถ€ํ„ฐ ๋๋‚  ๋•Œ๊นŒ์ง€ ์–ธ์ œ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ํƒ‘์žฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.) โ˜ž ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์— 'use strict'๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ •์˜๋œ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ์ดํ›„์—๋„ ๊ณ„์† ๋‚จ์•„์žˆ๋‹ค. โ˜ž var๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์ด๋ฏ€๋กœ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ๋ฌถ์œผ๋ฉด ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

<๋ณ€์ˆ˜> 2) let ( block scope, mutable )

# ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”
let i;  // ์„ ์–ธ, "undefined"๊ฐ€ ์ €์žฅ๋จ
let sum = 0;  // ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”

# ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ
let i, sum; 

# ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋™์‹œ์— ํ•ด์ค„ ์ˆ˜ ์žˆ์Œ
let i=0, sum=10, message=”Hello”;  

let์˜ ํŠน์ง•

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

 

<์ƒ์ˆ˜> 3) const ( block scope, immutable ) 

const ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์€ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜์Œ ์„ ์–ธํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

๋ณดํ†ต ๊ด€์Šต์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•œ๋‹ค.

const MY_NUM = 7;

immutable์˜ ์žฅ์ 

  1. ํ•œ ๋ฒˆ ์ž‘์„ฑํ•œ ๊ฐ’์„ ๋‹ค๋ฅธ ํ•ด์ปค๋“ค์ด ์ด์ƒํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด ๊ฐ’์„ ๊ณ„์† ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ thread๊ฐ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€๊ฒฝํ•˜๋Š” ์œ„ํ—˜์ด ์—†๋‹ค.
  3. ์‚ฌ๋žŒ์˜ ์‹ค์ˆ˜๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

 


2. function scope(ํ•จ์ˆ˜ ์œ ํšจ ๋ฒ”์œ„) vs block scope(๋ธ”๋ก ์œ ํšจ ๋ฒ”์œ„)

ํ•จ์ˆ˜
์œ ํšจ๋ฒ”์œ„
ํ•จ์ˆ˜ ์œ ํšจ๋ฒ”์œ„๋Š” ์–ด๋–ค ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜ ์ „์ฒด์— ๊ฑธ์ณ ์œ ํšจํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
์ด๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ฏธ์ฒ˜ ์„ ์–ธ๋˜๊ธฐ ์ „์—๋„ ์œ ํšจํ•˜๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜๋‹ค. => Hoisting ๋œ๋‹ค.
๋ธ”๋ก
์œ ํšจ ๋ฒ”์œ„
  • let์€ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ธ”๋ก, ๊ตฌ๋ฌธ ๋˜๋Š” ํ‘œํ˜„์‹ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค. ์ด๋Š” var ํ‚ค์›Œ๋“œ๊ฐ€ ๋ธ”๋ก ๋ฒ”์œ„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ ์ด๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํ•จ์ˆ˜์˜ ์ตœ์ƒ์œ„์—์„œ๋Š” let๊ณผ var๋Š” ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•œ๋‹ค. var๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, let์€ ์ „์—ญ ๊ฐ์ฒด์˜ ์†์„ฑ ๊ฐ’์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Hoisting ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”(์„ ์–ธ)๋˜๊ธฐ ์ „์— ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Sourcesํƒญ์—์„œ ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ , ๋กœ๋“œํ•˜๋ฉด, ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ Scope ์ฐฝ์—์„œ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

2-1) Hoisting 

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€, ์–ด๋””์— ์„ ์–ธํ–ˆ๋ƒ์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์ œ์ผ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • var ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์—์„œ๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚œ๋‹ค.
  • var ๋ณ€์ˆ˜/ํ•จ์ˆ˜์˜ ์„ ์–ธ๋งŒ ์œ„๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง€๋ฉฐ, ํ• ๋‹น์€ ๋Œ์–ด ์˜ฌ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค.
  • let/const ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.