๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Study Note/JavaScript

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive - ํ˜ธ์ด์ŠคํŒ…, var, let, const

by Jellll_y 2022. 12. 9.

var, let, const ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ํ˜ธ์ด์ŠคํŒ…์— ๊ด€ํ•ด์„œ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

var 

- ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

var a = 'a'
console.log(a) // 'a'

var a = 'aa'
console.log(a) // 'aa'

- ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค

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

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ž€?

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

 

 

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

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ… ๊ณผ์ •์—์„œ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹ ์— ์ง„ํ–‰๋˜๋ฉฐ ์ด๋•Œ undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ ์„ ์–ธ ์ „์— ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

console.log(x) // ํ˜ธ์ด์ŠคํŒ… ์„ ์–ธ๊ณผ ๋™์‹œ์— undefined๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

var x = 'global' // ๋ณ€์ˆ˜ x์— ๊ฐ’ 'global' ํ• ๋‹น

console.log(x) // 'global'

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€?

๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ์Šค์ฝ”ํ”„์˜ ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

- ์ „์—ญ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜, ์ „์—ญ ํ•จ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ์„ ์–ธํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•œ ์•”๋ฌต์  ์ „์—ญ์€ 

์ „์—ญ ๊ฐ์ฒด window์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.

let, const๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” window ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค

var x = 'global'
y = 'global' 
function foo(){}

let z = 'global'

console.log(window.x) // 'global'
console.log(window.y) // 'global'
console.log(window.foo) // foo(){}

console.log(window.z) // let, const๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” window ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. => undefined

=> ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์—ฌ์ง€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š๋‹ค.

 

let 

var์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•˜๊ณ ์ž es6๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ƒ๊ฒผ๋‹ค

- ๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค

let x = 'global'
let x = 'error' // SyntaxError: Identifier 'x' has already been declared

 

- ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค

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

let x = 'global' 

{
	let x = 'local'
    let z = 'local'
}

console.log(x) // 'global'
console.log(z) // ReferenceError: z is not defined

function foo(){
	let i = 'foo_local'
    for(let i=0; i<10; i++){
		console.log(i) // 0 ~ 9
    }
    console.log(i) // 'foo_local'
}

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ž€?

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

 

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

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

์ด์œ ๋Š” var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ™์ด ๋˜์ง€๋งŒ (undefined)

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

 

์„ ์–ธ๋‹จ๊ณ„  x ReferenceError
์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€ TDZ
์ดˆ๊ธฐํ™” ๋‹จ๊ณ„  let x , x = undefined
ํ• ๋‹น ๋‹จ๊ณ„ x = 'global' 

์ดˆ๊ธฐํ™” ์ „์— ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์‹œ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ)๋ผ๊ณ  ํ•œ๋‹ค.

 

// x ์„ ์–ธ
console.log(x) // ReferenceError: x is not defined => TDZ

let x; // x = undefined ์ดˆ๊ธฐํ™”
console.log(x) // undefined 

x = 'global' // ๊ฐ’ ํ• ๋‹น
console.log(x) // 'global'

=> ์žฌํ• ๋‹น ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ 

const

let๊ณผ ๋Œ€๋ถ€๋ถ„ ๋น„์Šทํ•˜๋‹ค. 

 

- ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค

 

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

const๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฐ™์ด ํ•ด์•ผ ํ•œ๋‹ค. 

const x = 1 

// Error
const y
y = 1

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

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

 

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

์›์‹œ ๊ฐ’์„ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

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

์›์‹œ ๊ฐ’์ด๋ž€? 

๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ number, bigInt, string, null, undefined, boolean, symbol์ด ์žˆ๋‹ค.

 

=> ์˜๋„์น˜ ์•Š์€ ์žฌํ• ๋‹น์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•˜๋‹ค.

์ •๋ฆฌ

- es6์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด var๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ์žฌํ• ๋‹น์ด ํ•„์š” ์—†๋Š” ์›์‹œ ๊ฐ’ ๋˜๋Š” ๊ฐ์ฒด์—๋Š” const๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ let์„ ์‚ฌ์šฉํ•œ๋‹ค.