๐Ÿ“… Weekly Paper - (Lexical Environment)

๊น€ํ˜„์šฐยท2024๋…„ 7์›” 10์ผ
1

Codeit

๋ชฉ๋ก ๋ณด๊ธฐ
4/8
post-thumbnail

๐Ÿ“… ์ฃผ๊ฐ„ ํ˜„ํ™ฉ ๋ณด๊ณ 

1-0. ์ž‘์„ฑ ๋ชฉ์  ๋ฐ ๋ชฉ์ฐจ

์ด๋ฒˆ 3์ฃผ์ฐจ Weekly Paper ์—์„œ๋Š”

  1. ์ด๋ฒˆ์ฃผ ๊ฐ•์˜ ํ›„๊ธฐ ๋ฐ ์Šค์Šค๋กœ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ
  2. var, let, const์˜ ๋น„๊ต
  3. Lexical Scope์˜ ๊ฐœ๋…๊ณผ ๊ทธ ํŠน์„ฑ
  4. JS์—์„œ์˜ this ํ‚ค์›Œ๋“œ์˜ ์‚ฌ์šฉ ๋ฐ ํŠน์„ฑ

์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


1-1. ๊ฐ•์˜ ํ›„

์ƒ๊ฐ๋ณด๋‹ค ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ทธ๋ƒฅ ๋ฐฐ์šฐ๊ณ ๋‚˜๋ฉด ๋ญ”๊ฐ€ ์žฌ๋ฐŒ๋‹ค

๊ทธ๋ƒฅ ๊ณ„์† ์ƒ๊ฐํ•ด๋ณด๋Š”๊ฒƒ๋„ ๊ทธ๋ ‡๊ณ 
๋ชจ๋ฅด๋Š”๊ฑฐ ์ฐพ์•„๋ณด๋Š”๊ฒƒ๋„ ๊ทธ๋ ‡๊ณ 

ํŒ€์›๋“ค๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด์•„๋„
์„œ๋กœ์˜ ๋กœ์ง์ด๋‚˜ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉํ–ฅ, ์ชผ๊ฐœ๋†“์€๊ฒƒ์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค

๋น„๊ตํ•ด๋ณด๋ฉด ์•„~ ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฑฐ๋„ ๋˜๋Š”๊ตฌ๋‚˜, ์‹ถ์€๊ฒŒ ์ฐธ ์‹ ๊ธฐํ•˜๋‹ค
๊ทผ๋ฐ ๋Œ€์ฒด๋กœ ๋‚ด๊ฐ€ ํ•ด๋†“์€๋ฐฉ์‹์€ ์ข€ ์ฃผ๋จน๊ตฌ๊ตฌ์‹์ด๋ผ
์ข€.. ๊น”๋”ํ•˜๊ฒŒ ํ•ด์•ผํ•˜์ง€์•Š์„๊นŒ? ์‹ถ๊ธฐ๋Š” ํ•˜๋‹ค ใ…‹ใ…‹..

1-2. ์ฃผ๊ฐ„ ์‹ค๊ธฐ

PC_Size

Tablet_Size

Mobile_Size

Valid test

์ด๋ฒˆ์ฃผ์— ์ง„ํ–‰ํ•œ๊ฒƒ์€ ๋ฐ˜์‘ํ˜• ์›น ๊ตฌํ˜„ํ•˜๊ธฐ์™€
ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ (์ด๋ฉ”์ผ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์‚ฌ ๋“ฑ๋“ฑ..)

๊ทธ๋ฆฌ๊ณ  ํ† ๊ธ€ํ˜•์‹์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์ด๊ธฐ/์ˆจ๊ธฐ๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ

ํšŒ์›๊ฐ€์ž…์„ ํ•œ ๋’ค, ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€๋œ ๋ฐฐ์—ด์„
์œ ์ง€ํ•˜๋Š”๊ฑฐ๋Š” ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ์จ์„œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š”๋ฐ
์ด๊ฒŒ ํ‰๊ฐ€๋Œ€์ƒ์€ ์•„๋‹ˆ๊ณ  ์•„์ง ํ•˜์ง€๋Š” ์•Š์•„์„œ, ๋‹ค๋ฅธ๊ณณ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”๋œ๋‹ค..

์žฌ๋ฐŒ๊ธด.. ํ–ˆ์Œ!

2. var, let, const์˜ ๋น„๊ต

2-1. var

JS๊ฐ€ ํƒ„์ƒํ•œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์žˆ์—ˆ๋˜ ์œ ์„œ๊นŠ์€ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฐฉ์‹.
์žฌ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์žˆ๋‹ค.
var๋Š” ์ „์—ญ ๊ฐ์ฒด์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ
"ํ•จ์ˆ˜์Šค์ฝ”ํ”„"์ด๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๊ณ , "undefined"๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. (ํ˜ธ์ด์ŠคํŒ…์€ ๋”ฐ๋กœ ๋‹ค๋ฃฌ๋‹ค)

ํ•˜์ง€๋งŒ,
์žฌ์„ ์–ธ ๋ฐ ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์— ๋”ฐ๋ผ์˜ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ,

    var A = "A";
    var X = 10;

    if (X > 9) {
        var A = "B"; 
    }
    
    console.log(A) // if๋ฌธ ๋‚ด์—์„œ ์—…๋ฐ์ดํŠธ๋œ "B"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ

X๋Š” 9๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— True๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ 
๊ทธ์—๋”ฐ๋ผ์„œ A๋Š” "B"๋กœ ์žฌ์ •์˜๋œ๋‹ค.

ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ A๋ฅผ "B"๋กœ ์žฌ์ •์˜ํ•˜๋Š”๊ฒƒ์ด ์˜๋„์ ์ธ ๊ฒฝ์šฐ๋ผ๋ฉด ์ƒ๊ด€์ด ์—†์ง€๋งŒ
๋ณ€์ˆ˜ A๋ฅผ "A"๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ณ ์žˆ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด,
๋‹ค๋ฅธ ๋ณ€์ˆ˜ A๋ฅผ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ์—์„œ ์ƒ๊ฐ์ง€ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ฐ„๋‹จ ์˜ˆ์‹œ
function Var() {
  if (true) {
    var x = 10;
  }
  console.log(x); // 10์ด ์ถœ๋ ฅ๋œ๋‹ค (ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„)
}

Var();

2-2. let

ECMAScript 6์—์„œ ์ถ”๊ฐ€๋œ ๋ณ€์ˆ˜์„ ์–ธ ๋ฐฉ๋ฒ•์œผ๋กœ
์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์žˆ๋‹ค..
var๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ „์—ญ ๊ฐ์ฒด์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ 
"๋ธ”๋ก ์Šค์ฝ”ํ”„" ์ด๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.

let์ด ์„ ์–ธ๋  ๋•Œ๋Š” ๋ธ”๋ก ๋ฒ”์œ„๋กœ ์ง€์ •๋œ๋‹ค.
์ฆ‰, ํ•ด๋‹น ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

   let A = "A";
    if (true) {
        let A = "B";
        console.log(A); // "B"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
    }
    console.log(A); // "A"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

A๋ฅผ "B"๋กœ ์žฌ์ •์˜ํ–ˆ์„๋•Œ,
๋ณ€์ˆ˜ A์˜ ๋ฒ”์œ„๋Š” ๋ธ”๋ก์œผ๋กœ ํ•œ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—
๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋Š” B๋กœ "์—…๋ฐ์ดํŠธ" ๋œ ์ƒํƒœ๋กœ ์ถœ๋ ฅ๋˜๊ธฐ๋•Œ๋ฌธ์— B๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ.
๋ธ”๋ก ๋ฐ–์—์žˆ๋Š” ๋ณ€์ˆ˜ A๋Š” ๋‹ค์‹œ A๋กœ ๋Œ์•„์˜ค๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์‹ค์ƒ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋˜๋Š”๊ฒƒ.

ํ•˜์ง€๋งŒ

let A = "A";
A = "B"; //A๋Š” ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ.

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋™์ผ ๋ฒ”์œ„ ๋‚ด์—์„œ ์žฌ์„ ์–ธ ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.


๊ฐ„๋‹จ ์˜ˆ์‹œ

function Let() {
  if (true) {
    let y = 10;
  }
  console.log(y); // ์ฐธ์กฐ์˜ค๋ฅ˜๊ฐ€ ์ผ์–ด๋‚œ๋‹ค (Y๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์Œ)
}

Let();

๋ฒ”์œ„์ž์ฒด๊ฐ€ "๋ธ”๋ก ์Šค์ฝ”ํ”„" ์ด๋‹ค ๋ณด๋‹ˆ
๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์— ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๋ธ”๋ก์—์„œ๋Š” ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์—†๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


2-3. const

ECMAScript 6์—์„œ ์ถ”๊ฐ€๋œ ๋ณ€์ˆ˜์„ ์–ธ ๋ฐฉ๋ฒ•์œผ๋กœ
์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์—†๋‹ค.
var๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ „์—ญ ๊ฐ์ฒด์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ 
"๋ธ”๋ก ์Šค์ฝ”ํ”„" ์ด๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.

let๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ธ”๋ก์Šค์ฝ”ํ”„์ด๊ณ , ์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ๊นŒ์ง€ ๋˜‘๊ฐ™์ง€๋งŒ
let๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋„ ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ชจ๋“  const๋Š” ์„ ์–ธ๋‹น์‹œ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ฐ์ฒด๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋Š”๋ฐ

    const Kim = {
        name: "HyunU",
        age: 21
    }

์ด๋Ÿฐ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด

    const Kim = {
        gender: "Male",
        Year: 1 
    } // ์ƒ์ˆ˜๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ

์œ„์ฒ˜๋Ÿผ ๋ณ€์ˆ˜ Kim ์ž์ฒด์— ๊ฐ์ฒด๋ฅผ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

Kim.gender = "Male";
Kim.Year = 1;

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ
const๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.


๊ฐ„๋‹จ ์˜ˆ์‹œ

function Const() {
  const z = 30;
  z = 40; // ์ƒ์ˆ˜๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ
}

Const();

2-4. ํ˜ธ์ด์ŠคํŒ…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ์„œ

ํ”„๋กœ๊ทธ๋žจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์„ฑ์ˆœ์œผ๋กœ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ง„ํ–‰๋œ๋‹ค.
ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ™์€ ์นœ๊ตฌ๋“ค์€ ๋‹ค๋ฅด๋‹ค.

"hoisting"
๋ง ๊ทธ๋Œ€๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
ํŠน์ • ์Šค์ฝ”ํ”„ ์•ˆ์˜ ์–ด๋””์—์„œ๋“  ๋ณ€์ˆ˜์„ ์–ธ์€ ์ตœ์ƒ์œ„์—์„œ ์„ ์–ธ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€๊ฒƒ.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹จ์ˆœํžˆ "var A = A"๋ผ๋Š” ๊ตฌ๋ฌธ์ด ์žˆ์„๋•Œ,
๋Œ์–ด์˜ฌ๋ ค์กŒ๋‹ค๋ฉด

console.log(A) // undefined
var A = A

์ด๊ฑฐ๋Š” undefined๊ฐ€ ์•„๋‹ˆ๊ณ  A๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผํ•˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?

์•„๋ž˜์—์„œ ํ™•์ธํ•ด๋ณด์ž.

"๋Œ์–ด์˜ฌ๋ ค ์ง„๋‹ค" ๋ผ๋Š” ๊ฒƒ์€

var x = '๋ฐ”๊นฅ์ชฝ์˜ ์Šค์ฝ”ํ”„';
(function() {
  console.log(x); // undefined
  var x = '์•ˆ์ชฝ์˜ ์Šค์ฝ”ํ”„';
}());

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค

var x = '๋ฐ”๊นฅ์ชฝ์˜ ์Šค์ฝ”ํ”„';
(function() {
  var x;
  
  console.log(x); // undefined
  var x = '์•ˆ์ชฝ์˜ ์Šค์ฝ”ํ”„';
}());

์ด ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค๋Š” ์˜๋ฏธ๋‹ค.
์‚ฌ์‹ค ์œ„์—์„œ var๋ฅผ ๋ณด๊ณ ์™”์œผ๋ฉด

ํ•จ์ˆ˜ ๋ฐ–์˜ x๊ฐ€ ์Šค์ฝ”ํ”„ ๋ฐ–์ด๋‹ˆ ์ฐธ์กฐํ• ์ˆ˜์—†๊ณ ,
ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ x๋˜ํ•œ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ ์ดˆ๊ธฐํ™”๋˜๋‹ˆ๊นŒ
console.log(x)์˜ ์ถœ๋ ฅ๊ฐ’์ดundefined์ธ๊ฑฐ๋Š” ๋‚ฉ๋“ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋˜ํ•œ, ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”

A = "A";
var A;

// ์œ„์™€ ์•„๋ž˜๋Š” ์˜๋ฏธ๊ฐ€ ๊ฐ™๋‹ค.

var A;
A = "A";

์ด๋Ÿฐํ˜•ํƒœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ

  console.log(x); // ์ฐธ์กฐ์—๋Ÿฌ ๋ฐœ์ƒ! (const๋„ ๋™์ผํ•˜๋‹ค)
  let x = 'X';

์ด ์ฝ”๋“œ๋Š” ์–ด๋–ค๊ฐ€?

์•„๋‹ˆ, ์ฐธ์กฐ์—๋Ÿฌ ๋ฐœ์ƒ?
๋ฐฉ๊ธˆ ํ˜ธ์ด์ŠคํŒ… ๋œ๋‹ค๊ณ  ๋‹ค~ ์จ๋‘์ง€์•Š์•˜๋‚˜?
์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ด์ŠคํŒ…์ด ์•ˆ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?

๋‹จ์ˆœํžˆ "๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค" ๋ผ๊ณ  ๋งํ•œ๋‹ค๋ฉด ์˜คํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ
var A = A ๋ผ๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ๋Œ€์ž…๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ง€ ์•Š๋Š”๋‹ค.
var A์™€ A = A๋ผ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋”ฐ๋กœ๋”ฐ๋กœ ๋ณด๊ณ 
์ฒซ๋ฒˆ์งธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ 
๋‘ ๋ฒˆ์งธ ๊ตฌ๋ฌธ์€ ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ด๊ฒƒ์€ ์Šค์ฝ”ํ”„์˜ ๋ชจ๋“  "์„ ์–ธ๋ฌธ"๋“ค์€ ์‹คํ–‰ ์ „์— ๋จผ์ € ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, let๊ณผ const๋Š” ์–ด์งธ์„œ var๊ณผ ๋‹ค๋ฅธ๊ฒƒ์ธ๊ฐ€?
์กฐ~๊ธˆ ๋ณต์žกํ•ด์ง€๋Š”๋ฐ ๊ณ„์† ๊ฐ€๋ณด์ž.


2-4-1. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” "์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด" ์ด๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š”
๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ
ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑ์‹œํ‚ค๊ณ .

์ด๊ฒƒ๋“ค์„ Call stack
(ํ˜„์žฌ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ค‘์ธ์ง€, ๊ทธ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ๋“ฑ์„ ์ œ์–ดํ•˜๋Š”๊ณณ)์— ์ญ‰์ญ‰์ญ‰ ์Œ“์•„์˜ฌ๋ ธ๋‹ค๊ฐ€

๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„
์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์— ๋‹ด๊ธด๋‹ค.
(๊ทธ๋ƒฅ ํ•จ์ˆ˜ ๋‚ด์— ์—†๋Š” ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์ „์—ญ ์ปจํ…์ŠคํŠธ ์•ˆ์— ์žˆ๋‹ค.)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ผ๋ถ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ธ€๋กœ๋ฒŒ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Global Execution Context)๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

์ „์—ญ ์ปจํ…์ŠคํŠธ๋Š” ๋”ฑํžˆ ์ฝ”๋“œ์—์„œ ์‹คํ–‰๋ช…๋ น์„ ํ•˜์ง€ ์•Š์•„๋„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์—ด๋ฆฌ๋Š” ์ˆœ๊ฐ„
์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  ์ฝœ์Šคํƒ์— ๋‹ด๊ธด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ์—๋Š” window ๊ฐ์ฒด๊ฐ€ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋œ๋‹ค.

์ฝœ์Šคํƒ ์˜ˆ์‹œ์‚ฌ์ง„
(์‚ฌ์ง„์„ ์ฐธ๊ณ ํ•˜๋ฉฐ ์ฝ์–ด๋ณด์ž)

์ด์ œ ์ฝœ ์Šคํƒ์—์„œ ์ „์—ญ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€
์‚ฌ์ง„์˜ one ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด JS์—”์ง„์€
one ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ
one ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด Call stack์— ์Œ“๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Call stack์˜ ๋งจ ์œ„์— one ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋†“์˜€์œผ๋‹ˆ,
์ „์—ญ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ณ 
one ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์ธ one ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋“ค์„ ์ˆœ์ฐจ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  two ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ๋งŒ๋‚˜์„œ, ๋‹ค์‹œ ์Œ“๊ณ  ๋‚˜์„œ
๊ทธ ์•ˆ์—์„œ ๋˜๋‹ค์‹œ three ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ๋งŒ๋‚˜๊ณ 
์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์— ๋‹ด๊ธฐ๋ฉด
์ด์ œ๋Š” one์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ 

three ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋˜์–ด three ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด three ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ ,
๊ทธ๋Ÿฌ๋ฉด two ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ ์Šคํƒ์˜ ๋งจ ์œ„์— ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ
์ค‘๋‹จํ–ˆ๋˜ ๋ถ€๋ถ„(three๋ฅผ ๋งŒ๋‚œ๋ถ€๋ถ„)๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋Š” ์‹œ์ ์—(์ฝœ์Šคํƒ์˜ ๋งจ ์œ„์— ์Œ“์ด๋Š” ์ˆœ๊ฐ„์—)
JS์—”์ง„์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ
ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ์ˆ˜์ง‘ํ•ด์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์— ์ €์žฅํ•œ๋‹ค.

2-4-2. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ตฌ์„ฑ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉฐ ์ƒ๊ฒจ๋‚˜๋Š” ๊ฒƒ๋“ค๋กœ๋Š”
Lexical Environment
VariableEnvironment
This.binding์ด ์žˆ๊ณ .

  1. Lexical Environment
    ์ด๊ฒƒ์€ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์™€ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ฐธ์กฐ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
์–ดํœ˜์  ํ™˜๊ฒฝ(Lexical enviroment)์ด๋ž€
ํ•จ์ˆ˜, ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ์Šค์ฝ”ํ”„๋ฅผ ์˜๋ฏธํ•œ๋‹ค
์„ ์–ธ ๋‹น์‹œ์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด์ด๋‹ค. ์ฆ‰, ๊ตฌ์„ฑ ํ™˜๊ฒฝ์ด๋‹ค.
์ฒ˜์Œ์—๋Š” VariableEnvironment์™€ ๊ฐ™๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค
  1. VariableEnvironment
์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์–ดํœ˜ ํ™˜๊ฒฝ์˜ ์ผ๋ถ€๋กœ์„œ, 
๋ณธ์งˆ์ ์œผ๋กœ ํ˜„์žฌ ๋งฅ๋ฝ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ๊ธฐ๋Šฅ(์‹๋ณ„์ž)์— ๋ถˆ๊ณผํ•˜๋‹ค.
์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด
์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment์˜ "์Šค๋ƒ…์ƒท" ์œผ๋กœ
๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.
  1. this-binding
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š”๋ฐ, ์ด๊ฒƒ์„ "this binding"์ด๋ผ๊ณ  ํ•œ๋‹ค.

์•„๋ž˜์—์„œ ์ถ”๊ฐ€๋กœ this ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ๊ฒƒ์ด๋‹ค.


์ด์ œ LexicalEnvironment์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ
ํ˜ธ์ด์ŠคํŒ…์„ ์•Œ์•„๋ณด์ž.

  • ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ(Environment Record)๋‹ค
    ์Šค์ฝ”ํ”„์— ํฌํ•จ๋œ ์‹๋ณ„์ž์™€ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ ๋œ ๊ฐ’์„
    name : value๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
    ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋œ๋‹ค.

JS๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ด์ „, ๋ฏธ๋ฆฌ ๋ชจ๋“  ์‹๋ณ„์ž๋“ค์„ ์ˆ˜์ง‘ํ•ด๋‘”๋‹ค.
๊ทผ๋ฐ ์œ„์—์„œ๋„ ๋งํ–ˆ๋“ฏ, ๋ณ€์ˆ˜๋ฅผ ์ธ์‹ํ•  ๋•Œ ์‹๋ณ„์ž๋งŒ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ  ํ• ๋‹น ๊ณผ์ •์€ ์›๋ž˜ ์ž๋ฆฌ์— ์ˆœ์„œ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘”๋‹ค.

์—ฌ๊ธฐ์„œ ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฐœ๋…์ด ๋‚˜์˜ค๋Š”๋ฐ
ํ˜ธ์ด์ŠคํŒ…์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ํ•ด์„์„ ์ข€ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด
environmentRecord์˜ ์ˆ˜์ง‘ ๊ณผ์ •์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ๋…์œผ๋กœ
์ตœ์ƒ๋‹จ์œผ๋กœ ์ด ์‹๋ณ„์ž๋“ค์„ '๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค'๊ณ  ํ•ด์„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


- ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ(outer Lexical Environment Reference)

์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ์ฐธ์กฐ์—๋Š”
"ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ์˜ค๋ธŒ์ ํŠธ"์— ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ
ํ•ด๋‹น ๋กœ์ปฌ ์Šค์ฝ”ํ”„์™€ ์—ฐ๊ด€๋ผ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์—์„œ ๋จผ์ € ์ฐพ๊ณ ,
๊ทธ ์•ˆ์— ์—†์œผ๋ฉด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ๊ฐ–๊ณ  ์žˆ๋Š”
์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ์ ‘๊ทผํ•ด์„œ
๊ทธ ์™ธ๋ถ€ ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์— ์žˆ๋Š”์ง€ ๋˜ ์ฐพ๋Š”๋‹ค.

๊ทธ๋‹ˆ๊นŒ ์ด๋Ÿฐ ๊ณผ์ •์œผ๋กœ
์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ
๊ฒ€์ƒ‰ํ•ด๋‚˜๋Š” ๊ฒƒ์ด "์Šค์ฝ”ํ”„์ฒด์ธ" ์ธ๊ฒƒ

์ด๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”๊ฒƒ์ด ๋ฐ”๋กœ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ธ๊ฒƒ์ด๊ณ 
์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ „์—ญ๊นŒ์ง€ ํƒ€๊ณ  ๊ฐ€์„œ ์‹๋ณ„์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์—†์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


์œ„์—์„œ ๋งํ–ˆ๋“ฏ
์ด๋ ‡๊ฒŒ var์™€ const, let์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—

ํ•œ ํ•จ์ˆ˜ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ธ”๋ก ์Šค์ฝ”ํ”„๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๊ฐ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ณ„๋กœ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ Lexical Environment ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๊ฑฐ๊ณ 

๋ฐ˜๋ฉด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅด๋Š” var ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ Variable Environment์— ์ €์žฅ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์˜ ๊ณผ์ • ๋Œ€ํ•œ ์„ค๋ช…์ธ๊ฒƒ์ด๊ณ 

์ด์ œ ์ œ๋Œ€๋กœ var,let,const์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž!


2-4-3. var, let, const์˜ ์ƒ์„ฑ๊ณผ์ • ์ฐจ์ด

๋ณ€์ˆ˜ ์ž์ฒด๋Š” ์–ดํœ˜์  ํ™˜๊ฒฝ์— ํฌํ•จ๋  ๋•Œ ์ƒ์„ฑ๋˜์ง€๋งŒ
์–ดํœ˜์  ๋ฐ”์ธ๋”ฉ(ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณ€์ˆ˜๋“ค์ด ๊ฐ–๋Š” ์†์„ฑ์ด๋‚˜ ๊ฐ’์ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ)๊นŒ์ง€ ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ์— ์ €์žฅํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค.

์—ฌ๊ธฐ์„œ ์ด์ œ var, const, let์˜ ์ฐจ์ด๊ฐ€ ๋‚˜์˜จ๋‹ค.

JS์—์„œ์˜ ๋ณ€์ˆ˜๋Š”
์„ ์–ธ, ์ดˆ๊ธฐํ™”, ํ• ๋‹น์ด๋ผ๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑธ์ณ์„œ ์ƒ์„ฑ๋˜๋Š”๋ฐ

var ๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์ „์— ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๋™์‹œ์— ์ง„ํ–‰ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ์„ ํ•ด๋„
ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ˆ˜์ง‘๊ณผ์ •์—์„œ ํ• ๋‹น์ž๋Š” ๋‚จ์•„์žˆ์–ด๋„
undefined๋กœ ํ˜ธ์ถœ์ด ๋˜๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ!

ํ•˜์ง€๋งŒ
let,const ์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” var ํ‚ค์›Œ๋“œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ
์„ ์–ธ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด์„œ ์ง„ํ–‰์ด ๋œ๋‹ค

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ๋ ˆ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ˆ˜์ง‘๊ณผ์ •์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ–ˆ์ง€๋งŒ
(์ด๋ฏธ ํ˜ธ์ด์ŠคํŒ…์€ ๋˜์–ด์žˆ์ง€๋งŒ),
ํ• ๋‹น์ด ๋˜์งˆ ์•Š์•„(์ดˆ๊ธฐํ™”๊ณผ์ •์ด ์•„์ง ์ง„ํ–‰๋˜์ง€ ์•Š์•˜์Œ) ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด
์ฐธ์กฐ ์—๋Ÿฌ(ReferenceError)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ์ด๊ณ ,

๊ทธ๋ž˜์„œ ํ˜ธ์ด์ŠคํŒ…์—์„œ ๋‚˜์˜ค๋Š” TDZ๋Š”
TDZ๋Š” ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘ ์ง€์ (๋ณ€์ˆ˜ ๋“ฑ๋ก์‹œ์ )๋ถ€ํ„ฐ
์ดˆ๊ธฐํ™” ์‹œ์ž‘ ์ˆœ๊ฐ„๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์„ ๋งํ•˜๋Š”๊ฒƒ์ด๋‹ค.

var, let, const


3. ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

๊ฐ„๋‹จํžˆ, ์œ„์—์„œ ๋งํ•œ Lexical Environment๋Š”
๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์˜ ์‹ค์ฒด์ด๋‹ค. ์–ด๋–ป๊ฒŒ ๊ตด๋Ÿฌ๊ฐ€๋Š”์ง€๋Š” ๋ชจ๋‘ ์•Œ์•˜์œผ๋‹ˆ
์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค!

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š”

ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ "ํ˜ธ์ถœ"ํ•˜๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋””์— "์„ ์–ธ"ํ•˜์˜€๋Š”์ง€์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์‚ฌ์‹ค ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค

์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋ญ”์ง€
์Šค์ฝ”ํ”„์ฒด์ธ์ด ๋ฌด์—‡์ธ์ง€
์œ„์—์„œ ๋‹ค ์ƒ๊ฐํ•ด๋ณด์ง€ ์•Š์•˜๋Š”๊ฐ€

์•„๋ž˜์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

var x = 1; // global

function A() {
  var x = 10;
  B();
}

function B() {
  console.log(x);
}

A(); // ?
B(); // ?

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์‹คํ–‰๊ณผ์ •์—์„œ ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์˜ ์Šค์ฝ”ํ”„๊ฐ€ ์ •ํ•ด์ง„๋‹ค.
์ „์—ญ์˜ ๋ณ€์ˆ˜ x
function A์˜ ๋ณ€์ˆ˜ x
function B์˜ ๋ณ€์ˆ˜ x

function B์˜ ๋ณ€์ˆ˜ x๋Š” fucntion B์—์„œ x๋ฅผ ์ฐพ์€๋’ค -> ์ „์—ญ์œผ๋กœ ์˜ฌ๋ผ๊ฐˆ๊ฒƒ์ด๊ณ  ์ „์—ญ์—์„œ x = 1์„ ์ฐพ์€ ์ˆœ๊ฐ„
๊ทธ์ˆœ๊ฐ„๋ถ€ํ„ฐ function B์˜ console.log(x)๋Š” 1์„ ๋ฑ‰๊ธฐ๋กœ ์ •ํ•ด์ ธ์žˆ์œผ๋‹ˆ

ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์œ„์น˜๊ฐ€ ์ „์—ญ์ด๋“ , function A๋“  ์ƒ๊ด€์—†์ด

console.log(x)๋Š” 1์„ ๋ฑ‰๋Š”๊ฒƒ์ด๋‹ค

๋”ฐ๋ผ์„œ fucntion A์™€ B๋Š” ๋‘˜๋‹ค 1์„ ๋ฑ‰๋Š”๋‹ค.

4. This ํ‚ค์›Œ๋“œ (this binding)

this ํ‚ค์›Œ๋“œ๋ผ๋Š”๊ฒƒ์€
์ง€๊ธˆ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํŠน๋ณ„ํ•œ ํ‚ค์›Œ๋“œ์ด๋‹ค.

ํ’€์–ด์„œ ์ด์•ผ๊ธฐํ•œ๋‹ค๋ฉด.
this binding์€

ํ˜ธ์ถœ๋˜๋Š” ์œ„์น˜์™€ ํ˜ธ์ถœ๋œ ์‹œ์ ์˜
์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •

์„ ๋”ฐ๋ฅด๋Š”

์œ„์— ์„ค๋ช…ํ•œ lexical scope์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ธ
dynamic scope๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๊ฐ€
"์„ ์–ธ์˜ ์œ„์น˜"๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด

๋™์  ์Šค์ฝ”ํ”„๋Š”
"ํ˜ธ์ถœ์˜ ์œ„์น˜"๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฒƒ.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ this ํ‚ค์›Œ๋“œ์˜ ์—ญํ• ์„ ์‚ดํŽด๋ณด์ž!

4-1. ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ this

์ „์—ญ ์ฝ”๋“œ์—์„œ this๋Š” ์ „์—ญ ๊ฐ์ฒด(global object)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” window ๊ฐ์ฒด๋ฅผ
Node.js ํ™˜๊ฒฝ์—์„œ๋Š” global ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

console.log(this); // ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์ด๋ผ๋ฉด window

4-2. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ this์˜ ๊ฐ’์€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค
(๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๋˜์ง€, newํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•œ๋‹ค๋˜์ง€ ๋“ฑ)

//์ผ๋ฐ˜ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค.
function foo() {
  console.log(this);
}
foo(); // ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์ด๋ผ๋ฉด window, strict mode๋ผ๋ฉด undefined๋กœ ์ง€์ •๋œ๋‹ค.
//๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค
const obj = {
  name: "Kim",
  getName: function() {
    console.log(this.name);
  }
};

obj.getName(); // Kim [๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ๋˜์–ด ํ•ด๋‹น๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค]
function Person(name) {
  this.name = name;
}

const person = new Person('Kim');
console.log(person.name); // Kim [์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค]

์™ธ์—๋„ add, apply ๋ฉ”์„œ๋“œ๋กœ this๊ฐ€ ์ฐธ์กฐํ•  ๋Œ€์ƒ์„
์ •ํ•ด์ค„์ˆ˜๋„์žˆ๊ณ ,
bind ๋ฉ”์„œ๋“œ๋กœ this๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์ˆ˜๋„์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ™”์‚ดํ‘œํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋Š”
์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ Dynamic scope๊ฐ€ ์•„๋‹Œ
Lexical Scope๋ฅผ ๋”ฐ๋ฅด๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๊ธฐ์—
์ž์‹ ๋งŒ์˜ this๊ฐ€ ์—†๊ณ , ์ƒ์œ„๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

const obj = {
  value: 42,
  regularFunction: function() {
    console.log(this.value);
  },
  arrowFunction: () => {
    console.log(this.value);
  }
};

obj.regularFunction(); // 42 (obj๊ฐ€ this๋กœ ๋ฐ”์ธ๋”ฉ๋จ)
obj.arrowFunction();   // undefined (์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด)

์ด๋Ÿฐ์‹์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ์— ํ™”์‚ดํ‘œํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ์ด์ ์ด ์žˆ๋Š”๋ฐ

function Timer() {
  this.seconds = 0;
  setInterval(() => {
    this.seconds++;
    console.log(this.seconds);
  }, 1000);
}

const timer = new Timer();
// 1, 2, 3, ... (1์ดˆ๋งˆ๋‹ค this.seconds๊ฐ€ ์ฆ๊ฐ€)

์œ„ ์˜ˆ์‹œ์—์„œ setInterval์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ์—
์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” Timer ๊ฐ์ฒด์˜ this๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋˜๊ฒƒ์ด๊ณ .

๋งŒ์•ฝ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด,
setInterval์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜์–ด
this.seconds๋Š” undefined์ด๊ณ , undefined++๋Š” NaN์ด ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.


์ด์ฒ˜๋Ÿผ this ํ‚ค์›Œ๋“œ๋Š” ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ
thisํ‚ค์›Œ๋“œ๋ฅผ ์ž˜ ์ดํ•ดํ•˜๋Š”๊ฒƒ์€
์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ์งค์ˆ˜์žˆ๋„๋ก ๋•๋Š”๋‹ค!


๐Ÿท๏ธ ๋งˆ๋ฌด๋ฆฌ

์—ด์‹ฌํžˆ ์ฐพ์•„๋ณด๋ฉด์„œ ๊ธ์–ด๋ชจ์•„ ์ผ๋Š”๋ฐ
๋„ˆ๋ฌด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.
A๋ฅผ์ฐพ์œผ๋ฉด A์—์„œ B๋ž‘ C๋ผ๋Š”
์ƒˆ๋กœ์šด ๊ฐœ๋…์ด๋ผ ๋‚˜์˜ค๋Š”์‹์œผ๋กœ ๋ฌดํ•œํ•˜๊ฒŒ ์ด์–ด์ง€๋Š” ๋Š๋‚Œ์ด๋ผ

์•„๋ฌด๋ž˜๋„ ๋ณธ๋ฌธ์— ์ข€ ์ƒ๊ด€์—†๋Š” ๋‚ด์šฉ๋„ ๋งŽ์ด ๋“ค์–ด๊ฐ€์žˆ์ง€ ์‹ถ๋‹ค.

์•„์ง๋„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ๊ฑด์ง€ ์•„๋ฆฌ๊นŒ๋ฆฌํ•œ๋ฐ,
์™„์ „ํžˆ ์ดํ•ดํ•˜๋ฉด ์ง„์งœ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ธ€์„ ํ•œ๋ฒˆ ์™„์ „ํžˆ ์ƒˆ๋กœ ์จ์•ผ์ง€ ์‹ถ๊ณ ..

๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค~


#์ฝ”๋“œ์ž‡์Šคํ”„๋ฆฐํŠธ #์Šคํ”„๋ฆฐํŠธํ’€์Šคํƒ1๊ธฐ #์ทจ์—…๊นŒ์ง€๋‹ฌ๋ฆฐ๋‹ค

profile
Codeit ์Šคํ”„๋ฆฐํŠธ / ํ’€์Šคํƒ 1๊ธฐ ์ˆ˜๊ฐ•์ค‘์ธ ๊น€ํ˜„์šฐ์ž…๋‹ˆ๋‹ค!

3๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 7์›” 13์ผ

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ
const๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์จ์ฃผ์‹  const๋‚ด์šฉ์— ์œ„์™€๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ๋Š”๋ฐ, ํ˜น์‹œ ์ด ์ด์œ ๋„ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”?

1๊ฐœ์˜ ๋‹ต๊ธ€