๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

var/let/const ํ‚ค์›Œ๋“œ ๋ณธ๋ฌธ

๋ณ€์ˆ˜ ์„ ์–ธ์˜ ์‹คํ–‰ ์‹œ์ ๊ณผ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

var ํ‚ค์›Œ๋“œ ๋ณ€์ˆ˜ ์„ ์–ธ ๋™์ž‘ ์›๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 2๋‹จ๊ณ„์— ๊ฑฐ์ณ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

  1. ์„ ์–ธ ๋‹จ๊ณ„ : ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋“ฑ๋ก(์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ)ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ๋ณ€์ˆ˜์˜ ์กด์žฌ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  2. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ : ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ์•”๋ฌต์ ์œผ๋กœ undefined๋ฅผ ํ• ๋‹นํ•ด ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค. (const ์ œ์™ธ)
console.log(score); // undefined

var score = 'Hello World'

console.log(score); // 'Hello World'

var hoisting = '์„ ์–ธ๋ฌธ์ด ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์˜ ๊ณ ์œ ํ•œ ํŠน์ง•์ธ ํ˜ธ์ด์ŠคํŒ… ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค'

 

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ํŠน์ง•

1. ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ

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

 

var x = 1;
var y = 1;

var x = 100; // var ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘(์žฌํ• ๋‹น ์ฒ˜๋Ÿผ ๋™์ž‘)
var y // ๋ฌด์‹œ

console.log(x); // 100
console.log(y); // 1

 

2. ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

   var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค๋กœ์ง€ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ์„ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธํ•ด๋„ ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

 

var x = 1; // x๋Š” ์ „์—ญ๋ณ€์ˆ˜

if(true) {
	var x = 10; // x๋Š” ์ „์—ญ๋ณ€์ˆ˜ ์ค‘๋ณต์„ ์–ธ์œผ๋กœ var ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘
}

 

3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

  var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. (undefined๋กœ ์ดˆ๊ธฐํ™”)

 

4. window ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ ๋กœ ์•”๋ฌต์  ์ „์—ญ๋„ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.)

var score = 'Hello World';
console.log(score); // 'Hello World'
console.log(window.score); // 'Hello World' (window ์ „์—ญ ๊ฐ์ฒด ์ฐธ์กฐ๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅ)

 

let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ํŠน์ง•

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

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

 

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

  let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก(ํ•จ์ˆ˜, if ๋ฌธ, for ๋ฌธ, while ๋ฌธ, try/catch ๋ฌธ ๋“ฑ)์„ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•˜๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. 

let foo = 1; // ์ „์—ญ ๋ณ€์ˆ˜

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

console.log(foo) // 1

 

3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

  let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

console.log(foo) // ReferenceError: foo is not defined
let foo;

๊ทธ ์ด์œ ๋Š” let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” "์„ ์–ธ ๋‹จ๊ณ„"์™€ "์ดˆ๊ธฐํ™” ๋‹จ๊ณ„"๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ "์„ ์–ธ ๋‹จ๊ณ„"๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์ง€๋งŒ "์ดˆ๊ธฐํ™” ๋‹จ๊ณ„"๋Š” ๋Ÿฐํƒ€์ž„ ์ดํ›„ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๋™์ž‘ ์›๋ฆฌ

let foo = 1; // ์ „์—ญ ๋ณ€์ˆ˜

{
	console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
	let foo = 2; // ์ง€์—ญ ๋ณ€์ˆ˜
}

// ๋งŒ์•ฝ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์œ„ ์ฝ”๋“œ์—์„œ ์ „์—ญ ๋ณ€์ˆ˜ foo์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
// ํ•˜์ง€๋งŒ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋„ ์—ฌ์ „ํžˆ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

  โœ… ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ES6์—์„œ ๋„์ž…๋œ let, const๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์„ ์–ธ๋ฌธ(var, let, const, function, class ๋“ฑ)์„ ํ˜ธ์ด์ŠคํŒ… ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ES6์—์„œ ๋„์ž…๋œ let, const, class๋ฅผ ์‚ฌ์šฉํ•œ ์„ ์–ธ๋ฌธ์€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

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

  let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ winodw.foo ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. var ํ‚ค์›Œ๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฐœ๋…์ ์ธ ๋ธ”๋ก ๋‚ด์— ๋ณ„๋„๋กœ ์ €์žฅ๋˜์–ด ๊ด€๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

let foo = 1;

console.log(window.foo); // undefined
console.log(foo); // 1

 

const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ํŠน์ง•

1. ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”

  const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ(Syntax Error)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

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

  let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

3. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

  let ํ‚ค์›Œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

4. ์žฌํ• ๋‹น ๊ธˆ์ง€

  const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ์žฌํ• ๋‹น์‹œ Type Error๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

5. ์ƒ์ˆ˜

  const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์˜ ์ƒ๋Œ€ ๊ฐœ๋…์ธ ์ƒ์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๊ธˆ์ง€๋œ ๋ณ€์ˆ˜๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์„ ๊ธˆ์ง€ํ•  ๋ฟ "๋ถˆ๋ณ€"์„ ์˜๋ฏธํ•˜๋Š”๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. 

 

-์›์‹œ ํƒ€์ž…์˜ ๊ฐ’ : ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ, null, undefined, symbol)์„ const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๊ฒฝ์šฐ ํ• ๋‹น๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

 

-๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฐ’ : ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’(๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ)์„ const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ, ์‚ญ์ œ, ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

  var  let const
ํ˜ธ์ด์ŠคํŒ… o o (TDZ) o (TDZ)
๊ฐ’์˜ ์žฌํ• ๋‹น o o x
๋™์ผ ์Šค์ฝ”ํ”„ ์ค‘๋ณต ์„ ์–ธ o x x
์ „์—ญ ๊ฐ์ฒด window ํ”„๋กœํผํ‹ฐ o x x