๐Ÿง  01. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ & ์Šค์ฝ”ํ”„ โ€” JS ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฝ๋Š”๊ฐ€?

2026๋…„ 3์›” 8์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

JS ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹, ํ˜ธ์ด์ŠคํŒ…์˜ ์›๋ฆฌ, var/let/const ์Šค์ฝ”ํ”„์˜ ์ฐจ์ด๋ฅผ ์‹ค๋ฌด ๊ด€์ ์—์„œ ์™„์ „ ์ •๋ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • JS ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌด์—‡์„ ๋จผ์ € ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ˜ธ์ด์ŠคํŒ…(Hoisting)์ด ์™œ ์ผ์–ด๋‚˜๋Š”์ง€, var๊ฐ€ ์™œ ๋ ˆ๊ฑฐ์‹œ ๋ƒ„์ƒˆ๊ฐ€ ๋‚˜๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค.
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chain)์ด ๋ณ€์ˆ˜ ํƒ์ƒ‰์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๋จธ๋ฆฟ์†์— ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 20๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 12๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
[JS ์—”์ง„์˜ 2๋‹จ๊ณ„ ์‹คํ–‰] โ†’ [์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ] โ†’ [ํ˜ธ์ด์ŠคํŒ… ์ดํ•ด] โ†’ [์Šค์ฝ”ํ”„ ์ฒด์ธ ํƒ์ƒ‰]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • "์™œ var๋ฅผ ์“ฐ์ง€ ๋ง๋ผ๋Š” ๊ฑฐ์•ผ?"์— ๊ธฐ์ˆ ์  ๊ทผ๊ฑฐ๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ReferenceError: Cannot access before initialization ์—๋Ÿฌ์˜ ์›์ธ์„ ์ฆ‰์‹œ ์ง„๋‹จํ•œ๋‹ค.
  • ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ์Šค์ฝ”ํ”„์—์„œ ํƒ์ƒ‰๋˜๋Š”์ง€ ์ฝœ ์Šคํƒ์„ ๊ทธ๋ฆฌ๋ฉฐ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

๐Ÿฃ ์˜์ฒ : "์˜ํ˜ธ ๋‹˜, ์˜ค๋Š˜ ์ง„์งœ ํ™ฉ๋‹นํ•œ ์ผ์ด ์žˆ์—ˆ์–ด์š”. ์ œ๊ฐ€ var๋กœ ๋ฐ˜๋ณต๋ฌธ ๋ณ€์ˆ˜ ์„ ์–ธํ•ด์„œ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์—์„œ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์งฐ๋Š”๋ฐ... ๋ฃจํ”„๊ฐ€ ๋๋‚œ ๋’ค์— ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๋‹ˆ๊นŒ ๋ณ€์ˆ˜๊ฐ€ ์ „๋ถ€ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ตณ์–ด์žˆ๋Š” ๊ฑฐ์˜ˆ์š”! ์–ด๋–ป๊ฒŒ ๋ชจ๋“  i๊ฐ€ ๋‹ค 5์•ผ? ๋ถ„๋ช… 0, 1, 2, 3, 4๊ฐ€ ์ฐํ˜€์•ผ ํ•˜๋Š”๋ฐ... ๋ฉ˜ํƒˆ์ด ํ”๋“ค๋ ธ์Šต๋‹ˆ๋‹ค."

๐Ÿฆ ์˜ํ˜ธ: "๊ทธ๊ฑฐ, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ชจ๋ฅด๋ฉด ํ‰์ƒ ๋‹นํ•˜๋Š” ํ•จ์ •์ด์•ผ. var๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ผ์„œ ๋ฃจํ”„์˜ {} ๋ธ”๋ก์„ ๋ฌด์‹œํ•˜๊ณ , ๊ทธ ์œ„ ํ•จ์ˆ˜(๋˜๋Š” ์ „์—ญ)์— ๋”ฑ ํ•˜๋‚˜๋งŒ ์„ ์–ธ๋˜๊ฑฐ๋“ . ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋  ๋•Œ ๋ชจ๋“  ํด๋กœ์ €๊ฐ€ ๊ฐ™์€ i๋ฅผ ์ฐธ์กฐํ•˜๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ๋‚˜์˜ค์ง€. let์„ ์“ฐ๋ฉด ๋ธ”๋ก๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ”์ธ๋”ฉ์ด ์ƒ๊ฒจ์„œ ํ•ด๊ฒฐ๋ผ. ์ด๊ฒŒ ๋ฐ”๋กœ ์˜ค๋Š˜ ๋ฐฐ์šธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์Šค์ฝ”ํ”„ ์ด์•ผ๊ธฐ์•ผ."


๐Ÿค” 1. ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€?

์˜์ฒ ์ด๊ฐ€ ๋งŒ๋“  ๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

// ๐Ÿฃ ์˜์ฒ ์˜ ์ฝ”๋“œ โ€” ๋Œ“๊ธ€ 5๊ฐœ๋ฅผ ๋น„๋™๊ธฐ๋กœ ๊ฐ๊ฐ ๋กœ๋“œํ•˜๋ ค ํ–ˆ์Œ
for (var i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log("๋Œ“๊ธ€ " + i + "๋ฒˆ ๋กœ๋“œ ์™„๋ฃŒ"); // ์‹ค์ œ ์ถœ๋ ฅ: ์ „๋ถ€ "๋Œ“๊ธ€ 5๋ฒˆ ๋กœ๋“œ ์™„๋ฃŒ"
  }, 1000);
}

์˜์ฒ ์ด๋Š” 0, 1, 2, 3, 4๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” 5, 5, 5, 5, 5๊ฐ€ ์ถœ๋ ฅ๋๋‹ค.

์ด ๋ฒ„๊ทธ์˜ ์›์ธ์€ ๋‹จ ํ•˜๋‚˜: var๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๊ฐ€ ์—†๋‹ค. ๋ฃจํ”„๊ฐ€ ๋Œ์•„๋„ i๋Š” ์ „์—ญ(๋˜๋Š” ํ•จ์ˆ˜) ์ปจํ…์ŠคํŠธ์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ณ , setTimeout ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋  ๋•Œ๋Š” ์ด๋ฏธ ๋ฃจํ”„๊ฐ€ ๋๋‚˜ i === 5 ์ƒํƒœ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์Šค์ฝ”ํ”„๋ฅผ ์ดํ•ดํ•˜๋ฉด ์ด๋Ÿฐ ๋ณด์ด์ง€ ์•Š๋Š” ํ•จ์ • ์„ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ—๏ธ 2. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€?

JS ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋งŒ๋“œ๋Š” ํ™˜๊ฒฝ ์ •๋ณด ๋ฌถ์Œ ์ด๋‹ค. "์ด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?", "this๋Š” ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฐ€?"๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ๋‘ ๋‹จ๊ณ„ ๋กœ ์ƒ์„ฑ๋œ๋‹ค:

๋‹จ๊ณ„์ด๋ฆ„ํ•˜๋Š” ์ผ
1๋‹จ๊ณ„์ƒ์„ฑ ๋‹จ๊ณ„ (Creation Phase)๋ณ€์ˆ˜/ํ•จ์ˆ˜ ๋“ฑ๋ก(ํ˜ธ์ด์ŠคํŒ…), this ๊ฒฐ์ •
2๋‹จ๊ณ„์‹คํ–‰ ๋‹จ๊ณ„ (Execution Phase)์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ•œ ์ค„์”ฉ ์‹คํ–‰

ํ•ต์‹ฌ ๋ฉ˜ํƒˆ ๋ชจ๋ธ: JS ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ํ›‘๋Š”๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ›‘์„ ๋•Œ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘๊ณ , ๋‘ ๋ฒˆ์งธ ํ›‘์„ ๋•Œ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (GEC)

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, JS ์—”์ง„์ด ๊ฐ€์žฅ ๋จผ์ € ๊ตฌ์ถ•ํ•˜๋Š” ๊ธฐ์ดˆ ํ† ๋Œ€์ž…๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (GEC)
โ”œโ”€โ”€ VariableEnvironment (var ์„ ์–ธ๋“ค)
โ”‚   โ”œโ”€โ”€ userName: undefined  โ† ํ˜ธ์ด์ŠคํŒ…๋จ
โ”‚   โ””โ”€โ”€ getUserCount: function  โ† ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ์™„์ „ํžˆ ์˜ฌ๋ผ์˜ด
โ”œโ”€โ”€ LexicalEnvironment (let/const ์„ ์–ธ๋“ค)
โ”‚   โ””โ”€โ”€ POST_LIMIT: <uninitialized>  โ† TDZ ์ƒํƒœ
โ””โ”€โ”€ ThisBinding: window (๋ธŒ๋ผ์šฐ์ €) / global (Node.js)

ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (FEC)

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค, ๊ทธ ํ•จ์ˆ˜๋งŒ์„ ์œ„ํ•œ ์ „์šฉ ๊ณต๊ฐ„์ด ์ƒˆ๋กœ ์ƒ๊น๋‹ˆ๋‹ค. ์˜์ฒ ์ด๊ฐ€ ์ƒˆ๋กœ์šด ์œ ์ € ํ”„๋กœํ•„ ๋กœ๋“œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ์˜ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function loadUserProfile(userId) {
  const user = findUser(userId); // ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ƒˆ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ
  return user;
}
 
// loadUserProfile(42) ํ˜ธ์ถœ ์‹œ:
// ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (FEC)
// โ”œโ”€โ”€ Arguments: { userId: 42 }
// โ”œโ”€โ”€ LexicalEnvironment: { user: <uninitialized> }
// โ””โ”€โ”€ OuterEnvironment: โ†’ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (์Šค์ฝ”ํ”„ ์ฒด์ธ)

์ฝœ ์Šคํƒ (Call Stack)

์ƒ์„ฑ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋“ค์€ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ์กฐํšŒ๋ฅผ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„, ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‹œ๊ฐํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ โ€” ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ์กฐํšŒ ํ๋ฆ„
 
function getComments(postId) {
  return fetchFromDB(postId);  // fetchFromDB ํ˜ธ์ถœ
}
 
function renderPost(postId) {
  const comments = getComments(postId);  // getComments ํ˜ธ์ถœ
  return { comments };
}
 
renderPost(101);
 
// ์ฝœ ์Šคํƒ ์‹œ๊ฐํ™”:
// โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
// โ”‚  fetchFromDB (FEC)  โ”‚  โ† ํ˜„์žฌ ์‹คํ–‰ ์ค‘ (top)
// โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
// โ”‚  getComments (FEC)  โ”‚
// โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
// โ”‚   renderPost (FEC)  โ”‚
// โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
// โ”‚  ์ „์—ญ ์ปจํ…์ŠคํŠธ (GEC) โ”‚  โ† ํ•ญ์ƒ bottom
// โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
//
// fetchFromDB ์™„๋ฃŒ โ†’ pop
// getComments ์™„๋ฃŒ โ†’ pop
// renderPost ์™„๋ฃŒ โ†’ pop
// ์ „์—ญ๋งŒ ๋‚จ์Œ

๐Ÿ” 3. ํ˜ธ์ด์ŠคํŒ… โ€” ์„ ์–ธ์ด ์œ„๋กœ ๋Œ๋ ค์˜ฌ๋ผ๊ฐ„๋‹ค?

ํ˜ธ์ด์ŠคํŒ…์€ "์ฝ”๋“œ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์œ„๋กœ ์ด๋™" ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ ๋‹จ๊ณ„ ์—์„œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ๋ฏธ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์ด๋‹ค.

var ์˜ ํ˜ธ์ด์ŠคํŒ… ํญํƒ„

var ๋Š” ์„ ์–ธ๋˜๊ธฐ ์ „๋ถ€ํ„ฐ ๋งˆ์น˜ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ–‰๋™ํ•ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ๋ฅผ ๋‚ด๋ฑ‰๋Š” ๋Œ€์‹  undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์กฐ์šฉํžˆ ๋ฒ„๊ทธ๋ฅผ ์ˆจ๊ธฐ๊ณค ํ•˜๋Š”๋ฐ, ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์€ ์ด๋ฅผ "์–ธ์ œ ํ„ฐ์งˆ์ง€ ๋ชจ๋ฅด๋Š” ์‹œํ•œํญํƒ„ ๊ฐ™์€ ์ฝ”๋“œ"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

// โŒ ์ˆœ์ง„ํ•œ ์ฝ”๋“œ (Naive Approach) โ€” ์˜์ฒ ์ด์˜ ์ดˆ๊ธฐ ์ฝ”๋“œ
console.log(userName); // undefined (์—๋Ÿฌ๊ฐ€ ์•„๋‹˜! ์ด๊ฒŒ ๋” ๋ฌด์„œ์›€)
var userName = "์˜์ฒ ";
console.log(userName); // "์˜์ฒ "
 
// ๐Ÿฆ JS ์—”์ง„์ด ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ (์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ ๋“ฑ๋ก๋จ):
// var userName = undefined;  โ† ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ undefined๋กœ ์ดˆ๊ธฐํ™”
// console.log(userName);     // undefined
// userName = "์˜์ฒ ";          โ† ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ๊ฐ’ ํ• ๋‹น
// console.log(userName);     // "์˜์ฒ "

์™œ ์ด๊ฒŒ ๋ฌธ์ œ์ธ๊ฐ€? undefined๊ฐ€ ์กฐ์šฉํžˆ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋”˜๊ฐ€์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์—ฌ๋„ ์›์ธ์„ ์ฐพ๊ธฐ๊ฐ€ ๋งค์šฐ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์„ž์–ด ์“ธ ๋•Œ ๊ทธ ์œ„ํ—˜์„ฑ์ด ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.

// โŒ var์˜ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ํ•จ์ • โ€” ๋ฃจํ”„ ๋ฒ„๊ทธ
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // 3, 3, 3
}
 
// โœ… let์œผ๋กœ ๊ต์ฒด โ€” ๋ธ”๋ก ์Šค์ฝ”ํ”„
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // 0, 1, 2
}
// let์€ ๋ธ”๋ก({})`๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.
// ๊ฐ ์ดํ„ฐ๋ ˆ์ด์…˜๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ i๊ฐ€ ์กด์žฌํ•จ.

ํ•จ์ˆ˜ ์„ ์–ธ์‹ vs ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์ฐจ์ด

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์—”์ง„์˜ ๋Œ€์šฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์–ด๋–ค ๋…€์„์€ ํŒŒ์ผ ์ตœ์ƒ๋‹จ์—์„œ ๋ถˆ๋Ÿฌ๋„ ์”ฉ์”ฉํ•˜๊ฒŒ ๋‹ตํ•˜์ง€๋งŒ, ์–ด๋–ค ๋…€์„์€ "์•„์ง ์ค€๋น„๊ฐ€ ์•ˆ ๋๋‹ค"๋ฉฐ ์—๋Ÿฌ๋ฅผ ๋‚ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

// โœ… ํ•จ์ˆ˜ ์„ ์–ธ์‹ โ€” ์™„์ „ํžˆ ํ˜ธ์ด์ŠคํŒ…๋จ (์ •์˜๊นŒ์ง€ ์˜ฌ๋ผ์˜ด)
sayHello(); // "์•ˆ๋…•ํ•˜์„ธ์š”!" โ€” ์„ ์–ธ ์ „์— ํ˜ธ์ถœํ•ด๋„ ์ •์ƒ ์ž‘๋™
 
function sayHello() {
  console.log("์•ˆ๋…•ํ•˜์„ธ์š”!");
}
 
// โŒ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ โ€” ๋ณ€์ˆ˜๋งŒ ํ˜ธ์ด์ŠคํŒ…๋จ (undefined ์ƒํƒœ)
sayBye(); // TypeError: sayBye is not a function
 
var sayBye = function () {
  console.log("์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”!");
};
 
// โŒ const/let + ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ โ€” TDZ๋กœ ์ธํ•ด ReferenceError
greet(); // ReferenceError: Cannot access 'greet' before initialization
 
const greet = () => {
  console.log("๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!");
};

๐Ÿฆ ์˜ํ˜ธ์˜ ์กฐ์–ธ: "ํ•จ์ˆ˜ ์„ ์–ธ์‹์˜ ํ˜ธ์ด์ŠคํŒ… ๋•๋ถ„์— ํŒŒ์ผ ์•„๋ž˜์ชฝ์— ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๋ชจ์•„๋‘๋Š” ์Šคํƒ€์ผ์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•ด. ํ•˜์ง€๋งŒ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์„ ์–ธ ์ˆœ์„œ๊ฐ€ ์˜๋„๋ฅผ ์ „๋‹ฌ ํ•˜๋ฏ€๋กœ, ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹(const fn = () => {})์„ ์„ ํ˜ธํ•˜๋Š” ํŒ€๋„ ๋งŽ์•„."


๐Ÿ—‚๏ธ 4. ์Šค์ฝ”ํ”„ & ์Šค์ฝ”ํ”„ ์ฒด์ธ

์Šค์ฝ”ํ”„ (Scope) ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ ์˜์—ญ์ด๋‹ค. JS๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ (Lexical Scope)

ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์„œ ํ˜ธ์ถœ๋๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค์ง ์–ด๋””์„œ ํƒœ์–ด๋‚ฌ๋Š”๊ฐ€ ๊ฐ€ ๋ณ€์ˆ˜์˜ ์šด๋ช…์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ถŒํ•œ ์ฒดํฌ ๋กœ์ง์„ ํ†ตํ•ด ์ด ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ โ€” ๊ถŒํ•œ ์ฒดํฌ ๋กœ์ง
 
const APP_NAME = "์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ"; // ์ „์—ญ ์Šค์ฝ”ํ”„
 
function checkAuth() {
  const role = "admin"; // checkAuth ์Šค์ฝ”ํ”„
 
  function showWelcome() {
    // role์„ ์„ ์–ธํ•œ ์  ์—†์ง€๋งŒ, ์„ ์–ธ๋œ ์œ„์น˜(์ƒ์œ„ ์Šค์ฝ”ํ”„)์—์„œ ์ฐพ์•„์˜ด
    console.log(`${APP_NAME}์— ์˜ค์‹  ${role} ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!`);
    // โ†’ "์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ค์‹  admin ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!"
  }
 
  showWelcome();
}
 
checkAuth();
 
// ์Šค์ฝ”ํ”„ ์ฒด์ธ ํƒ์ƒ‰ ์ˆœ์„œ:
// showWelcome โ†’ checkAuth โ†’ ์ „์—ญ
// role: showWelcome์— ์—†์Œ โ†’ checkAuth์—์„œ ๋ฐœ๊ฒฌ โœ…
// APP_NAME: showWelcome์— ์—†์Œ โ†’ checkAuth์— ์—†์Œ โ†’ ์ „์—ญ์—์„œ ๋ฐœ๊ฒฌ โœ…

var / let / const ์Šค์ฝ”ํ”„ ๋น„๊ต

varletconst
์Šค์ฝ”ํ”„ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ธ”๋ก ์Šค์ฝ”ํ”„๋ธ”๋ก ์Šค์ฝ”ํ”„
ํ˜ธ์ด์ŠคํŒ…โœ… (undefined ์ดˆ๊ธฐํ™”)โœ… (TDZ, ์ดˆ๊ธฐํ™” ์•ˆ ๋จ)โœ… (TDZ, ์ดˆ๊ธฐํ™” ์•ˆ ๋จ)
์žฌ์„ ์–ธโœ… ๊ฐ€๋ŠฅโŒ ๋ถˆ๊ฐ€โŒ ๋ถˆ๊ฐ€
์žฌํ• ๋‹นโœ… ๊ฐ€๋Šฅโœ… ๊ฐ€๋ŠฅโŒ ๋ถˆ๊ฐ€
์‹ค๋ฌด ๊ถŒ์žฅโŒ ์‚ฌ์šฉ ๊ธˆ์ง€โœ… ๋ณ€๊ฒฝ ํ•„์š”ํ•œ ๋ณ€์ˆ˜โœ… ๊ธฐ๋ณธ๊ฐ’ (๋Œ€๋ถ€๋ถ„ ์ด๊ฑธ ์จ๋ผ)
// โŒ var โ€” ๋ธ”๋ก์„ ๋ฌด์‹œํ•˜๋Š” ์œ„ํ—˜ํ•œ ํ–‰๋™
function processPost() {
  if (true) {
    var tempData = "์ž„์‹œ ๋ฐ์ดํ„ฐ"; // if ๋ธ”๋ก ๋ฐ–์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ!
  }
  console.log(tempData); // "์ž„์‹œ ๋ฐ์ดํ„ฐ" โ€” ์˜๋„์น˜ ์•Š์€ ์ ‘๊ทผ
}
 
// โœ… let/const โ€” ๋ธ”๋ก ๊ฒฝ๊ณ„๋ฅผ ์ง€ํ‚จ๋‹ค
function processPost() {
  if (true) {
    const tempData = "์ž„์‹œ ๋ฐ์ดํ„ฐ"; // if ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจ
  }
  console.log(tempData); // ReferenceError: tempData is not defined โ† ๋ช…ํ™•ํ•œ ์—๋Ÿฌ!
}

TDZ โ€” Temporal Dead Zone

let๊ณผ const๋„ ์‚ฌ์‹ค ํ˜ธ์ด์ŠคํŒ…์€ ๋˜์ง€๋งŒ, ์•ˆ์ „์„ ์œ„ํ•ด "์„ ์–ธ๋ฌธ์ด ์‹คํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋งŒ์ง€์ง€ ๋งˆ์‹œ์˜ค" ๋ผ๋Š” ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

// TDZ ์‹œ๊ฐํ™”
{
  // โ† ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ TDZ ์‹œ์ž‘ (postTitle์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋์ง€๋งŒ ์ดˆ๊ธฐํ™” ์•ˆ ๋จ)
  console.log(postTitle); // โŒ ReferenceError: Cannot access 'postTitle' before initialization
 
  const postTitle = "ํด๋กœ์ € ์™„์ „์ •๋ณต"; // โ† ์—ฌ๊ธฐ์„œ TDZ ์ข…๋ฃŒ, ์ดˆ๊ธฐํ™”
 
  console.log(postTitle); // โœ… "ํด๋กœ์ € ์™„์ „์ •๋ณต"
}
 
// ์™œ TDZ๊ฐ€ ์ข‹์€๊ฐ€?
// var: ์„ ์–ธ ์ „ ์ ‘๊ทผ โ†’ undefined (์กฐ์šฉํ•œ ๋ฒ„๊ทธ)
// let/const: ์„ ์–ธ ์ „ ์ ‘๊ทผ โ†’ ReferenceError (์ฆ‰์‹œ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ช…ํ™•ํ•œ ์—๋Ÿฌ) โœ…

๐Ÿ“ 5. ์‹ค๋ฌด ํŒจํ„ด ์ •๋ฆฌ

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฐœ๋…๋“ค์„ ์‹ค๋ฌด ์ฝ”๋“œ์— ์–ด๋–ป๊ฒŒ ๋…น์—ฌ๋‚ด์•ผ ํ• ๊นŒ์š”? ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด ํŒ€์›๋“ค์—๊ฒŒ ๊ณต์œ ํ•œ "์ ˆ๋Œ€ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ์ „๋žต"์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

// โœ… ์‹ค๋ฌด์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ์ „๋žต
 
// 1. ๊ธฐ๋ณธ์€ const โ€” ๋Œ€๋ถ€๋ถ„์˜ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น ๋ถˆํ•„์š”
const API_BASE_URL = "https://api.youngsu.com";
const currentUser = { id: 42, name: "์˜์ฒ " };
 
// 2. ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ let
let retryCount = 0;
while (retryCount < 3) {
  // ...
  retryCount++;
}
 
// 3. var๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉ ๊ธˆ์ง€
// var isLoading = true; โ† ์ด ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ค๋ฉด ์˜ํ˜ธ ๋ฆฌ๋“œ๊ฐ€ reject
 
// 4. ํ•จ์ˆ˜๋Š” const + ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ผ๊ด€์„ฑ ์œ ์ง€
const fetchPost = async (postId) => {
  const response = await fetch(`${API_BASE_URL}/posts/${postId}`);
  return response.json();
};
 
// 5. for...of ๋ฃจํ”„์—์„œ๋„ const ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋งค ์ดํ„ฐ๋ ˆ์ด์…˜๋งˆ๋‹ค ์ƒˆ ๋ฐ”์ธ๋”ฉ)
const posts = [{ id: 1 }, { id: 2 }, { id: 3 }];
for (const post of posts) {
  console.log(post.id); // 1, 2, 3
}

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ์•„๋ž˜ ์ฝ”๋“œ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ , ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋ผ.

console.log(a);
console.log(b);
var a = 1;
let b = 2;

โœ… ์ •๋‹ต: undefined ์ถœ๋ ฅ ํ›„, ReferenceError: Cannot access 'b' before initialization

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • var a์˜ ํ˜ธ์ด์ŠคํŒ…: ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ a๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์„ ์–ธ ์ „ ์ ‘๊ทผํ•ด๋„ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • let b์˜ TDZ: b๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ฑ๋ก๋˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ(uninitialized) ๋กœ TDZ ๊ตฌ๊ฐ„์— ์žˆ๋‹ค. ์„ ์–ธ๋ฌธ ์‹คํ–‰ ์ „์— ์ ‘๊ทผํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: var๋Š” "์กฐ์šฉํ•œ undefined", let/const๋Š” "์‹œ๋„๋Ÿฌ์šด ์—๋Ÿฌ". ์‹œ๋„๋Ÿฌ์šด ์—๋Ÿฌ๊ฐ€ ๋” ์ข‹๋‹ค. ๋ฒ„๊ทธ๋ฅผ ์ฆ‰์‹œ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ.

Q2. ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์™€ ๋™์  ์Šค์ฝ”ํ”„์˜ ์ฐจ์ด๋Š”? JavaScript๋Š” ์–ด๋А ์ชฝ์ธ๊ฐ€?

โœ… ์ •๋‹ต: JavaScript๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ (์ •์  ์Šค์ฝ”ํ”„)

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜ ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ(์ •์ ์œผ๋กœ) ์Šค์ฝ”ํ”„๊ฐ€ ํ™•์ •๋œ๋‹ค.
  • ๋™์  ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์œ„์น˜ ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. (JavaScript๋Š” ์ด ๋ฐฉ์‹ ์‚ฌ์šฉ ์•ˆ ํ•จ)
  • JS๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์ด๋ฏ€๋กœ, ํ•จ์ˆ˜๋ฅผ ์–ด๋””์—์„œ ํ˜ธ์ถœํ•˜๋“  ์„ ์–ธ๋œ ์œ„์น˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ์ด๊ฒƒ์ด ํด๋กœ์ €์˜ ๊ทผ๊ฐ„์ด๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "ํ•จ์ˆ˜๊ฐ€ ํƒœ์–ด๋‚œ ๊ณณ์„ ๊ธฐ์–ตํ•œ๋‹ค." โ€” ํด๋กœ์ € ์ฑ•ํ„ฐ์—์„œ ์ด ๊ฐœ๋…์ด ํญ๋ฐœ์ ์œผ๋กœ ํ™•์žฅ๋œ๋‹ค.

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ โ€” ๊ธด๊ธ‰ ๋””๋ฒ„๊น…

์˜์ˆ˜ PM์ด ํ˜ธํ†ต์„ ์นœ๋‹ค: "์˜์ฒ  ๋‹˜, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ isAdmin ์ฒดํฌ๊ฐ€ ์™„์ „ํžˆ ๋šซ๋ ธ์–ด์š”! ๋ฃจํ”„ ์•ˆ์—์„œ ๊ถŒํ•œ ์ฒดํฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ค˜์š”!"

// ๐Ÿฃ ์˜์ฒ ์ด ๋ณด๋‚ธ ์ฝ”๋“œ
var isAdmin = false;
 
for (var i = 0; i < adminList.length; i++) {
  if (adminList[i].id === currentUser.id) {
    var isAdmin = true; // ์žฌ์„ ์–ธํ•ด๋„ ์—๋Ÿฌ ์—†์Œ!
  }
}
 
setTimeout(() => {
  if (isAdmin) {
    showAdminPanel(); // ์˜๋„๋Š” ๋งž์ง€๋งŒ ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ์œ„ํ—˜
  }
}, 0);

์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๊ฐ€? ์–ด๋–ป๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: var ์žฌ์„ ์–ธ ํ—ˆ์šฉ + ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋กœ ์ธํ•œ ๊ตฌ์กฐ์  ์ทจ์•ฝ์ . const์™€ Array.some()์œผ๋กœ ๊ต์ฒด.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • var isAdmin ์žฌ์„ ์–ธ: var๋Š” ๊ฐ™์€ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ์ค‘๋ณต ์„ ์–ธ์ด ํ—ˆ์šฉ๋œ๋‹ค. ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ๊ฐ™์€ ์ด๋ฆ„์˜ var๋ฅผ ์„ ์–ธํ•˜๋ฉด ์กฐ์šฉํžˆ ๋ฎ์–ด์“ด๋‹ค. ๋ณด์•ˆ ๋ฒ„๊ทธ์˜ ์”จ์•— ์ด๋‹ค.
  • ๋” ๋‚˜์€ ํŒจํ„ด (Pro Approach):
    // โœ… ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ
    const isAdmin = adminList.some((admin) => admin.id === currentUser.id);
    // - const: ์žฌํ• ๋‹น/์žฌ์„ ์–ธ ๋ถˆ๊ฐ€ โ†’ ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ ๋ฐฉ์ง€
    // - some(): ์กฐ๊ฑด ์ถฉ์กฑ ์ฆ‰์‹œ ์ˆœํšŒ ์ค‘๋‹จ (์„ฑ๋Šฅ โœ…)
    // - ํ•จ์ˆ˜ํ˜•: ์ˆœ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ๊ฐ€๋…์„ฑ ๊ทน๋Œ€ํ™”
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์ธ์ฆ์ด๋‚˜ ๋ณด์•ˆ์— ๊ด€๋ จ๋œ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ const๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค." var๋Š” ๋‚˜๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ๋‹ค๋ฅธ ์ฝ”๋“œ์— ์˜ํ•ด ๊ฐ’์ด ๋ฎ์–ด์จ์งˆ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

ํ‡ด๊ทผ๊ธธ ๋ฒ„์Šค์— ์•‰์•˜๋‹ค. ์˜ค๋Š˜ ์˜ํ˜ธ ๋‹˜์ด "์‹คํ–‰ ์ปจํ…์ŠคํŠธ" ์„ค๋ช…ํ•ด์ฃผ๋Š” ๊ฑฐ ๋“ฃ๊ณ , ์†”์งํžˆ ์ฒ˜์Œ์—๋Š” '์ด๊ฒŒ ๋ญ” ์ฒ ํ•™ ์ˆ˜์—…์ด์•ผ...' ์‹ถ์—ˆ๋Š”๋ฐ. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ๊นŒ ๋‚ด๊ฐ€ ๊ทธ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ์ฝ”๋“œ๋ฅผ ์งฐ๋Š”์ง€๊ฐ€ ๋А๊ปด์ ธ์„œ ์ข€ ๋ฏผ๋งํ•˜๋‹ค. var๋กœ ๋ฃจํ”„ ๋Œ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ์“ด ์ฝ”๋“œ๊ฐ€... ํŒ€ ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์— ์•„์ง ์‚ด์•„์žˆ์„ ํ…๋ฐ. ๋‚ด์ผ ์ถœ๊ทผํ•˜์ž๋งˆ์ž ์กฐ์šฉํžˆ PR ์˜ฌ๋ ค์•ผ๊ฒ ๋‹ค.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "JS ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ฝ๋Š”๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์‹คํ–‰ํ•œ๋‹ค. var๋Š” ์ฒซ ๋ฒˆ์งธ ๋•Œ undefined๋กœ ์กฐ์šฉํžˆ ๋“ค์–ด์˜ค๊ณ , let/const๋Š” TDZ๋กœ ์‹œ๋„๋Ÿฝ๊ฒŒ ์ž๊ธฐ ์กด์žฌ๋ฅผ ์•Œ๋ฆฐ๋‹ค. ์‹œ๋„๋Ÿฌ์šด ์ชฝ์ด ์˜คํžˆ๋ ค ์ฐฉํ•œ ๊ฑฐ๋‹ค."

์˜ํ˜ธ ๋‹˜ ๋•๋ถ„์— ์‚ด์•˜๋‹ค. ์˜ค๋Š˜ ํ•œ ๊ฑด ๋ฐฐ์› ์œผ๋‹ˆ๊นŒ, ์ง‘ ๊ฐ€์„œ ๋งฅ์ฃผ ํ•œ ์บ” ๋”ฐ๊ณ  ๋‹ค์Œ ์ฑ•ํ„ฐ ํ•œ ๋ฒˆ๋งŒ ๋” ํ›‘์–ด๋ด์•ผ์ง€. ํด๋กœ์ €๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ .


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ