๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“‚ Language/JavaScript

JavaScript์˜ hoisting (ํ˜ธ์ด์ŠคํŒ…) ์ด๋ž€? - let๊ณผ var์˜ ์ฐจ์ด, let๊ณผ const ํ˜ธ์ด์ŠคํŒ…

by Dev. Ella 2023. 2. 26.
*hoisting: ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ

 

hoist์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ' ๋ผ๋Š” ๋œป์ด๋‹ค. ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์ฝ”๋“œ๋ณด๋‹ค, ์„ ์–ธ ์ฝ”๋“œ๊ฐ€ ์•„๋žซ์ชฝ์— ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ๋งˆ์น˜ ์„ ์–ธ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ ์ฝ”๋“œ๋ณด๋‹ค ๋” ์œ„์— ์„ ์–ธ๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ์„ hoisting(ํ˜ธ์ด์ŠคํŒ…) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ๋ง์„ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž˜ ์•ˆ ๋  ๊ฒƒ์ด๋‹ค. ์šฐ์„  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘, let๊ณผ var์˜ ์ฐจ์ด์ ๋ถ€ํ„ฐ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฐœ๋…์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

let๊ณผ var์˜ ์ฐจ์ด: ํƒœ์ดˆ์— var๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค..

์˜›๋‚  ์˜›์ ์—๋Š” ์ง€๊ธˆ์˜ ์šฐ๋ฆฌ๊ฐ€ ๋„๋ฆฌ ์“ฐ๊ณ  ์žˆ๋Š” let์ด ์•„๋‹Œ, var๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ECMA-262 ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์— ๋”ฐ๋ผ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ ECMAScript๊ฐ€ 2015๋…„ 6์›”์— ES6๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜๋Š”๋ฐ, ์ด๋•Œ let์ด ์ฒ˜์Œ ๋‚˜์˜ค๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์ด๋‹ค. ์ฆ‰, var ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•œ ๊ฒƒ์ด๋‹ค. var ์‚ฌ์šฉ์— ๋Œ€์ฒด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ธธ๋ž˜?

 

 

1. ๊ฐ’์„ ์„ ์–ธ๋„ ํ•˜๊ธฐ ์ „์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ

์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋จผ์ € ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ์–ต์„ ํ•ด๋‘”๋‹ค. ์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ๋Š” ์„ ์ƒ๋‹˜์ด ์ˆ˜์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—(= ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์—) ์–ด๋–ค ํ•™์ƒ๋“ค์ด ์žˆ๋Š”์ง€(= ์–ด๋–ค ๋ณ€์ˆ˜๋“ค์ด ์žˆ๋Š”์ง€) ์กฐ์‚ฌ(= ์ถœ์„์ฒดํฌ) ๋ฅผ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค, ๋ˆ„๊ฐ€ ella ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ถ€๋ฅด๋ฉด ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์„ ๋ฒ”์œ„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ ค ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. 

 

var age = 10
var name = "Ella"
var student = true

console.log(age)

 

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ ๋” ์„ค๋ช…ํ•ด ๋ณด๊ฒ ๋‹ค.  ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ ์—†์ด 1์ด ์ž˜ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

var ella = 1 // var๋กœ ๋ณ€์ˆ˜ ella๋ฅผ ์„ ์–ธํ•˜๊ณ , ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1๋กœ ํ• ๋‹น
console.log(ella) // 1

 

ํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ella๊ฐ€ ์„ ์–ธ๋˜๊ธฐ๋„ ์ „์— ella๋ฅผ ์จ์„œ ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒƒ ๊ฐ™๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์—์„œ ์œ„๋กœ ํ˜๋Ÿฌ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ ์ƒ๋‹˜์€ ์—๋Ÿฌ๋ฅผ ๋‚ด์ง€ ์•Š๊ณ  undefined์™€ 1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

console.log(ella) // undefined
var ella = 1
console.log(ella) // 1

 

์™œ? ๋ฐ”๋กœ ํ˜ธ์ด์ŠคํŒ… ๋•Œ๋ฌธ์ด๋‹ค. ์šฐ๋ฆฌ ์œ„๋Œ€ํ•˜์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ ์ƒ๋‹˜์€ ์ฝ”๋“œ ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋ถ€ํ„ฐ ella๊ฐ€ ์—†์œผ๋ฉด ๋ฐ”๋กœ ์—๋Ÿฌ๋ฅผ ๋‚ด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, undefined๋ฅผ ์ฃผ๋ฉด์„œ ์•„์ง ํ• ๋‹น๋˜์ง€ ์•Š์•˜์Œ์„ ์ด์•ผ๊ธฐํ•˜๊ณ , ๋’ค์ด์–ด ๋‘ ๋ฒˆ์งธ ์ค„์— ella๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•œ ํ›„  1์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ฆ‰, ์ถœ์„์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๋ฐ”๋กœ ๊ฒฐ์„์ฒ˜๋ฆฌ๋ฅผ ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ ์ถœ์„ ๋ณด๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. 

 

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ? ํ˜ธ์ด์ŠคํŒ…์„ ํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ (undefinded ๋กœ) ์ดˆ๊ธฐํ™”๋ฅผ ๊ฐ™์ด ์‹œ์ผœ๋ฒ„๋ฆฌ๊ณ , ๊ฐ’ ํ• ๋‹น์€ ๋‚˜์ค‘์— ella๊ฐ€ ์žˆ๋Š” ํ•ด๋‹น ์ค„์— ๊ฐ€์„œ ํ•œ๋‹ค. 

 

์‹ฌ์ง€์–ด ์„ ์–ธ๋„ ํ•˜์ง€ ์•Š๊ณ , ์„ ์–ธ์„ ํ• ๋‹น ๋’ค์— ํ•ด๋ฒ„๋ ค๋„ undefined์™€  1์ด ๋‚˜์˜จ๋‹ค.

 

console.log(ella) // undefined
ella = 1
var ella
console.log(ella) // 1

 

 

2. ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ฐœ๋…์ด ํ™•์‹คํ•˜์ง€ ์•Š์Œ

์—ฌ๊ธฐ์„œ ์ž ๊น, ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜์˜ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋จผ์ € ์•Œ๊ณ  ๊ฐ€์ž.

์ „์—ญ๋ณ€์ˆ˜๋Š” ์–ด๋– ํ•œ ๋ฒ”์œ„๋„ ์—†์ด ๋ธ”๋ฝ { } ๋ฐ–์—์„œ ์„ ์–ธ์„ ํ•œ ์–ด๋””์„œ๋“  ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋‹ค.

 

var ella = 2

 

์ง€์—ญ๋ณ€์ˆ˜๋Š” function์ด๋‚˜ for๋ฌธ ๋“ฑ์˜ ๋ธ”๋ฝ { } ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋ฉฐ ๋ธ”๋ฝ ์•ˆ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

 

var ella = "yes"; // ์ „์—ญ ๋ณ€์ˆ˜ ella

function attend() {
    var chloe = "..."; // ์ง€์—ญ ๋ณ€์ˆ˜ chloe
}

console.log(chloe);
// ReferenceError: chloe is not defined
// { } ์ง€์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚จ

 

๋‘ ๋ณ€์ˆ˜์˜ ์ฐจ์ด๋ฅผ ์ž˜ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์•„๋ž˜์˜ for๋ฌธ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž.

 

for(var i = 1; i < 5; i++) {
	console.log(i)
}
console.log(i) // 1 2 3 4 5: ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Œ

 

์—ฌ๊ธฐ์„œ var i ๋Š” for๋ฌธ { } ์•ˆ์—์„œ ์„ ์–ธ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋ฝ ๋ฐ–์—์„œ i๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค. ํ•˜์ง€๋งŒ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, var๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜(function)๋งŒ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๊ณ , ๋‚˜๋จธ์ง€(for๋ฌธ, if๋ฌธ ๋“ฑ)๋Š” ๋‹ค ์ „์—ญ๋ณ€์ˆ˜๋กœ ์˜ฌ๋ ค๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

3. ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ด ๋  ์ˆ˜ ์žˆ์Œ

var ella = 1
console.log(ella) // 1

var ella = 2
console.log(ella) // 2

 

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ์ ˆ๋Œ€๋กœ ์ค‘๋ณต์ด ๋˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด๋ผ๋ฉด ๋‚˜์™€ ๊ฐ™์€ ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๋‘ ๋ช…์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ํŠนํžˆ ํฐ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก ๊ต‰์žฅํ•œ ํ˜ผ๋ž€์ด ์˜ฌ ๊ฒƒ์ด๋‹ค.

 

 

์œ„ ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ธํ•ด var์˜ ๋ฌธ์ œ์ ๋“ค์„ ๋ณด์™„ํ•  let์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ var์„ let์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ(?) ์—๋Ÿฌ๊ฐ€ ์ž˜ ๋‚œ๋‹ค. ella ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ์„ ์–ธ์ด ๋˜์—ˆ์œผ๋‹ˆ, ์ค‘๋ณต์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. 

 

let ella = 1
console.log(ella)

let ella = 2
console.log(ella) // SyntaxError: Identifier 'ella' has already been declared

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„์— ์ž‘์„ฑํ–ˆ๋˜ for๋ฌธ ์—์„œ๋„ let์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด i๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ •์ƒ์ ์ธ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. i๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ์ด ๋˜์—ˆ๋Š”๋ฐ, ๋ธ”๋ก ๋ฐ–์— ์žˆ๋Š” console.log(i)๋Š” ๋ธ”๋ก ์•ˆ์— ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. 

 

for(let i = 1; i < 5; i++) {
	console.log(i)
}
console.log(i) // ReferenceError: i is not defined

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ฒ˜์Œ์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ ์•ˆ์—์„œ๋„ var ๋Œ€์‹  let์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์ธ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ธฐ ์ „์— ella ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋‹ค. 

 

console.log(ella)
let ella = 1
console.log(ella) // ReferenceError: Cannot access 'ella' before initialization

 

 

let์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„, ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค! 

let์€ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ผ๊นŒ? ์‚ฌ์‹ค, let๋„ ํ˜ธ์ด์ŠคํŒ…์ด ๋œ๋‹ค.

 

console.log(ella) // TDZ: ์•„์ง ella๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ผ์‹œ์ ์œผ๋กœ ์ฃฝ์€ zone์ž„

let ella = 1 // ๋’ค๋Šฆ๊ฒŒ ella ์„ ์–ธํ•จ
console.log(ella) // ReferenceError: Cannot access 'ella' before initialization: ๊ทธ๋ž˜๋„ ์—๋Ÿฌ๋‚จ

 

ํ•˜์ง€๋งŒ let์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋งŒ๋“ค๋ฉด์„œ TDZ(Temporal Death Zone)์ด๋ผ๋Š” ๊ฐœ๋…๋„ ํ•จ๊ป˜ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ด๋ฏธ ์ฝ”๋“œ ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ ella๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด ๋œ ๊ฒƒ์€ ์•Œ์ง€๋งŒ, ella ์„ ์–ธ๋ฌธ์ด ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ella์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ == ์ฆ‰ ์ผ์‹œ์ ์œผ๋กœ ์ฃฝ์€ zone ์ด๋‹ค. ella๊ฐ€ ์ดˆ๊ธฐํ™”(initialization)๊ฐ€ ๋  ๋•Œ๊นŒ์ง€๋Š” ์•„๋ฌด๋ฆฌ ella์— ์ ‘๊ทผํ•ด๋„ ์‹ค์ œ๋กœ ์„ ์–ธ๋˜๊ณ  ํ• ๋‹น๋˜๋Š” ๋ผ์ธ ์ „๊นŒ์ง€๋Š” ella๋ฅผ ์“ธ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. 

 

let ella = 1 // ella ์„ ์–ธํ•จ
console.log(ella) // 1์ด ์ถœ๋ ฅ๋จ

 

 

๊ทธ๋ž˜์„œ let๊ณผ const์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ˜ธ์ด์ŠคํŒ… ๋˜๋Š”๋ฐ?

function a () {
	for(let i = 0; i < 10; i++){
    }
    return i;
}
console.log(a()) // ReferenceError: i is not defined: ๋ธ”๋ก ๋ฐ–์—์„œ return ํ•˜๊ธฐ ๋•Œ๋ฌธ

 

์šฐ์„ , var๋Š” function scope (= ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ), let๊ณผ const๋Š” block scope (= ๋ธ”๋ก ๋‚ด์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ)์ด๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ์—์„œ i๋Š” for๋ฌธ ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— return์„ ํ•˜๋ฉด ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. 

 

let a = 1
if(true) {
	console.log(a) // Cannot access 'a' before initialization: ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
    let a = 2
}

 

๋‹ค์‹œ ํ•œ๋ฒˆ ๋งํ•˜์ง€๋งŒ, ํ˜ธ์ด์ŠคํŒ…์€ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋‚˜ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š”๋ฐ, console.log(a)๋กœ a๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋„ ํ˜ธ์ด์ŠคํŒ… ๋˜์–ด ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ๋Š” ์„ ์–ธ๋งŒ ๋˜๊ณ  ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ์„ ์–ธํ•œ ๋ณ€์ˆ˜๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๊ธด ํ–ˆ์ง€๋งŒ, let๊ณผ cost๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๊ธด ๋‚œ๋‹ค๋Š” ๊ฑฐ๋‹ค. 

 

* var: ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” → ํ• ๋‹น
* let, const: ์„ ์–ธ → TDZ → ์ดˆ๊ธฐํ™” → ํ• ๋‹น

 

์™œ ์—๋Ÿฌ๊ฐ€ ๋œฐ๊นŒ? ๋ณดํ†ต ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ undefined๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์ด var๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ผ์–ด๋‚˜๋‚˜, let๊ณผ const๋Š” ์„ ์–ธ๊ณผ TDZ๊ฐ€ ์ค‘๊ฐ„์— ๋ง‰๊ณ  ์žˆ์–ด์„œ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๊ธฐ์— ์„ ์–ธ์€ ๋˜์—ˆ์œผ๋‚˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. 

 

๋”ฐ๋ผ์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋„์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ์ •์ƒ์ ์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

let a = 1
if(true) {
let a = 2
console.log(a) // 2
}

 

 

๊ฒฐ๋ก : var ์“ฐ์ง€ ๋ง๊ณ , let ์“ฐ์ž! 

 

๋‚ด์šฉ ์ฐธ์กฐ

- Youtube :์ฝ”๋”ฉ์•Œ๋ ค์ฃผ๋Š”๋ˆ„๋‚˜ <์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋Š”๋ฐ ์•„์ง๋„ let๊ณผ var์˜ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅธ๋‹ค๊ณ ? : ํ˜ธ์ด์ŠคํŒ…>

- Youtube : ํฐ๋Œ์˜ํ„ฐ์ „ <์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ const์™€ let์˜ ํ˜ธ์ด์ŠคํŒ…>

๋Œ“๊ธ€