Skip to content

Latest commit

ย 

History

History
380 lines (276 loc) ยท 14.4 KB

step1.md

File metadata and controls

380 lines (276 loc) ยท 14.4 KB

๋ฌธ์„œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

STEP 1

๐Ÿ’ก์งˆ์˜์‘๋‹ต์€ https://github.com/pul8219/TIL Issues ํƒญ์˜ ์•Œ๋งž์€ step ์ด์Šˆ์•ˆ์— ๋‚จ๊ฒจ์ฃผ์„ธ์š”. โžก๏ธ Issueํƒญ์œผ๋กœ ์ด๋™

  • ์ž‘์„ฑ์ž: Wol-dan (@pul8219)
  • ์Šคํ„ฐ๋”” ์ฃผ์ œ: FrontEnd ๋ฉด์ ‘ ์Šคํ„ฐ๋”” https://gitlab.com/siots-study/topics/-/wikis/home
  • ๊ณต๋ถ€ ๋ฒ”์œ„: ์‹ฌํ™”1์˜ const์™€ let์˜ ์ฐจ์ด ~ ๋„ค์ŠคํŒ…๋œ ์Šค์ฝ”ํ”„(Nested scopes)์—์„œ์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ•‘(Lexical scoping)
  • ๊ธฐํ•œ: 7/4(ํ† ) ~ 7/7(ํ™”)

๋ณด์ถฉ ํ•„์š”

๋ชฉ์ฐจ

๐Ÿ’ฌ

var

  • ์žฌ์„ ์–ธ ๊ฐ€๋Šฅ
  • function-level-scope (ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„)๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธ๋œ var ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜์ด๋‹ค.
  • ์„ ์–ธ ์ „์— ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋‹ค.(๊ทธ๋Ÿฌ๋‚˜ ์ด ๋•Œ ๊ฐ’์€ undefined์ด๋‹ค.) ์„ ์–ธ ์ „์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋‹ˆ... var ์‚ฌ์šฉ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜์ž.
  • var๋กœ ๋ณ€์ˆ˜ ์ƒ์„ฑ์‹œ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ด์ŠคํŒ… ํ˜„์ƒ ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.
var x = 0;
{
  var x = 1;
  console.log(x); // 1
}
console.log(x); // 1 ๐Ÿ‘ˆ ์ฝ”๋“œ ๋ธ”๋ก({})๋‚ด์— ์„ ์–ธ๋œ var๋ณ€์ˆ˜ x๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— {}์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
var sum = 0;
for (var i = 0; i < 10; i++) {
  sum += i;
}
console.log(sum);
console.log(i); // 10 ์ถœ๋ ฅ ๐Ÿ‘ˆ var๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” for block ๋ฐ–์—์„œ๋„ ์œ ํšจํ•œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.

const์™€ let

const์™€ let์˜ ๊ณตํ†ต์ 

  • block-level-scope (๋ธ”๋ก ์Šค์ฝ”ํ”„)
  • ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€
  • const์™€ let์€ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.
let foo = 123;
{
  let foo = 456; // ์ง€์—ญ ๋ณ€์ˆ˜ ๐Ÿ‘ˆ ์ „์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ foo์™€๋Š” ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ๋ณ€์ˆ˜์ด๋‹ค.
  let bar = 456; // ์ง€์—ญ ๋ณ€์ˆ˜
}
console.log(foo); // 123
console.log(bar); // ReferenceError: bar is not defined ๐Ÿ‘ˆ ์ „์—ญ์—์„œ๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์— ์„ ์–ธ๋œ bar ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. let์€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ!

๐Ÿ’ก [์ฐธ๊ณ ] let์€ ์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธ๋˜๋”๋ผ๋„ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

let์€ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ๋”ฐ๋ผ์„œ window ๊ฐ์ฒด์—๋„ ๋‹ด๊ธฐ์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

var foo = 123;
var foo = 456; // ์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅ

let bar = 123;
let bar = 456; // Uncaught SyntaxError ๐Ÿ‘ˆ ์žฌ์„ ์–ธ ๋ถˆ๊ฐ€

[์ฐธ๊ณ ] ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์™€ ๋ธ”๋ก ์Šค์ฝ”ํ”„

ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •

๋ธ”๋ก ์Šค์ฝ”ํ”„: ์ค‘๊ด„ํ˜ธ({}) ๋‹จ์œ„๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •

const์™€ let์˜ ์ฐจ์ด์ 

  • let์€ ์žฌํ• ๋‹น ๊ฐ€๋Šฅ, const๋Š” ์žฌํ• ๋‹น ๋ถˆ๊ฐ€ (๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์—๋Š” const(์ƒ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์ž)
  • const๋Š” ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
let x; // ์ด๋ ‡๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด undefined๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
// const x; // const ํ‚ค์›Œ๋“œ๋Š” ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Scope(์Šค์ฝ”ํ”„)

Scope(์Šค์ฝ”ํ”„, ์œ ํšจ๋ฒ”์œ„)๋Š” ์ฐธ์กฐ ๋Œ€์ƒ ์‹๋ณ„์ž(identifier, ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ๋“ฑ)๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ด๋‹ค. ์–ด๋–ค ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.

  • Scope A์˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š”, A์˜ ์™ธ๋ถ€/๋‚ด๋ถ€์—์„œ ๋ชจ๋‘ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • A์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์˜ค์ง A์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Scope์˜ ๊ฐœ๋…(MDN)

ํ˜„์žฌ ์‹คํ–‰ ๋ฌธ๋งฅ(context)์ด๋‹ค. context๋ž€ ์–ด๋–ค value์™€ expression์ด ๋ณด์ด๊ฑฐ๋‚˜ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ๋ƒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ณ€์ˆ˜๋‚˜ ํ‘œํ˜„์‹์ด ํ˜„์žฌ ์Šค์ฝ”ํ”„์— ์—†๋‹ค๋ฉด ์ด์šฉ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์Šค์ฝ”ํ”„๋Š” ๊ณ„์ธต์ ์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ์ž์‹ ์Šค์ฝ”ํ”„๋Š” ๋ถ€๋ชจ์Šค์ฝ”ํ”„์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Scope ์ข…๋ฅ˜

  • ์ „์—ญ ์Šค์ฝ”ํ”„
  • ์ง€์—ญ ์Šค์ฝ”ํ”„
    • ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ์„ ์–ธํ•œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋ธ”๋ก ์Šค์ฝ”ํ”„: ์ค‘๊ด„ํ˜ธ {} ๋‚ด๋ถ€์—์„œ const ๋˜๋Š” let์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์€ ์ค‘๊ด„ํ˜ธ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Scope ๋”๋ณด๊ธฐ

Scope Chain(์Šค์ฝ”ํ”„ ์ฒด์ธ)

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

์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ outerEnvironmentReference์ด๋‹ค. (์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ Lexical Environment ์ฐธ๊ณ )

Lexical Scope

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

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

var x = 1;

function foo() {
  var x = 10;
  bar();
}

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

foo(); // ?
bar(); // ?

์œ„ ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ 10๊ณผ 1์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, 1๊ณผ 1์ด ์ถœ๋ ฅ๋œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Lexical Scope๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์•„๋‹Œ ํ•จ์ˆ˜์˜ ์„ ์–ธ์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ bar() ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๋ณ€์ˆ˜์ธ x๊ฐ’์ธ 1์ด ๋‘๋ฒˆ ์ถœ๋ ฅ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ bar() ํ•จ์ˆ˜๊ฐ€ foo()ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋˜์–ด์žˆ์—ˆ๋‹ค๋ฉด bar()ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” foo()ํ•จ์ˆ˜์ผ ๊ฒƒ์ด๋‹ค.

[์ฐธ๊ณ ] Dynamic Scope

ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ์ •ํ•ด์ง€๋Š” ๊ฒƒ

Hoisting

  • ํ˜ธ์ด์ŠคํŒ…์€ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค๋Š” ์˜๋ฏธ -> ๋ฌด์—‡์ด ๋Œ์–ด์˜ฌ๋ ค์ง€๋‚˜?

    ๋ณ€์ˆ˜์˜ ์„ ์–ธ๋ถ€ ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜„์žฌ ์Šค์ฝ”ํ”„ ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค!

  • ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ, ํ•จ์ˆ˜๋‚ด์—์„œ ์ •์˜๋˜์—ˆ์„ ๊ฒฝ์šฐ์—” ์„ ์–ธ์ด ํ•จ์ˆ˜์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ, ํ•จ์ˆ˜ ๋ฐ”๊นฅ์—์„œ ์ •์˜๋˜์—ˆ์„ ๊ฒฝ์šฐ๋Š” ์ „์—ญ ์˜์—ญ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค.

hoisting();

function hoisting() {
  console.log(x);
  var x = 'hello';
}

์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—”์ง„ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ„ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

hoisting();

function hoisting() {
  var x; // ๐Ÿ‘ˆ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค.(๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…) ์ด ์‹œ์ ์˜ var๊ฐ’์€ ํ• ๋‹น ์ „์ด๊ณ , var์˜ ํŠน์„ฑ์ƒ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
  console.log(x); // undefined ์ถœ๋ ฅ
  x = 'hello'; // ์—ฌ๊ธฐ์„œ undefined์—์„œ 'hello'๋กœ ํ• ๋‹น์ด ์ด๋ค„์ง„๋‹ค.
}

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹๋„ ํ˜ธ์ด์ŠคํŒ…๋œ๋‹ค. (๋‹จ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ new ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜ ์ •์˜์‹œ์—” ํ˜ธ์ด์ŠคํŒ… ์•ˆ๋จ)

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ๊ฒฝ์šฐ - ํ˜ธ์ด์ŠคํŒ…, ์—๋Ÿฌ ๋ฐœ์ƒX
hoisting();
function hoisting() {
  console.log(x);
  var x = 'hello';
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ - ํ˜ธ์ด์ŠคํŒ…X, ์—๋Ÿฌ ๋ฐœ์ƒ
hoisting();
var hoisting = function () {
  console.log(x);
  var x = 'hello';
};

// new ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ - ํ˜ธ์ด์ŠคํŒ…X, ์—๋Ÿฌ ๋ฐœ์ƒ
hoisting();
var hoisting = new Function('', console.log('hello'));

const์™€ let์€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ ๊นŒ?

yes!

  • const, let ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์‹œ uninitialized๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

  • ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด undefined๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    • Why? const, let์€ TDZ์— ์˜ํ•ด ์ œ์•ฝ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
console.log(x); // ReferenceError: x is not defined
const x = 'hello';
  • TDZ๋ž€?

    • Temporal Dead Zone(์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€)
    • ๋ณ€์ˆ˜์˜ ์„ ์–ธ๋ถ€ํ„ฐ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ์‚ฌ์ด์— ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ง€์ ์„ ์˜๋ฏธ
    • const์™€ let์˜ ๊ฒฝ์šฐ, ๋ณ€์ˆ˜ ์ƒ์„ฑ์‹œ ReferenceError๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. (์ž์„ธํ•œ ๋ฐ”์ธ๋”ฉ ์‹œ์ ์€ ๋ชจ๋ฆ„) ๐Ÿ‘‰ ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•จ
      • let: ๊ฐ’ ํ• ๋‹น ์ „์— ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™
      • const: ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™

๋‹ค์Œ ์˜ˆ์ œ๋กœ const์™€ let์„ ์‚ฌ์šฉํ•  ๋•Œ TDZ์˜ ์ œ์•ฝ์„ ๋ฐ›๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž.

const test = '123';
function a() {
  console.log(test);
  let test = '456';
}
a(); // ?

ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด a() ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋กœ 123์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 123์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. const์™€ let์€ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” TDZํ˜„์ƒ์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋‚ด๋ถ€์ ์ธ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

const test = '123';
function a() {
  // let test; // ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€๊ฐ€ ์Šค์ฝ”ํ”„ ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค.
  // ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋์ง€๋งŒ ์•„์ง ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋งŒ๋‚˜์ง€ ์•Š์•˜๋‹ค.
  // ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„๋ž˜ test = '456';์—์„œ ํ• ๋‹น์ด ์ด๋ค„์ง€๊ธฐ ์ „๊นŒ์ง€ TDZ๊ตฌ๊ฐ„์ด ํ˜•์„ฑ๋œ๋‹ค.
  console.log(test); // Reference Error ๋ฐœ์ƒ! ๐Ÿ‘ˆ TDZ ๊ตฌ๊ฐ„์—์„œ๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค.
  let test = '456'; // ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋œ ์‹œ์ ๋ถ€ํ„ฐ๋Š” TDZ ์ƒํƒœ๋ฅผ ๋– ๋‚˜๊ฒŒ๋˜๊ณ , ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
}
a();

๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ƒ๊ธด ๊ถ๊ธˆ์ฆ

๊ธฐํƒ€

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ค‘์ฒฉ(nested) ํ•จ์ˆ˜๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉ๋œ๋‹ค.

์ „์—ญ ๊ฐ์ฒด window

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์ „์—ญ ๋ณ€์ˆ˜
  • ์œ ์ผํ•˜๋ฉฐ ์–ด๋–ค ์ปจํ…์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋จผ์ € ์ƒ์„ฑ๋œ๋‹ค.
  • ๋‚ด๋ถ€์  ์ƒ์„ฑ์ž๊ฐ€ ์—†๋‹ค. new๋ฅผ ์“ธ ์ˆ˜ ์—†๋‹ค.

window ๊ฐ์ฒด

  • BOM ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์†Œ, JS ์—”์ง„, ๋ณ€์ˆ˜, ๊ฐ์ฒด, ํƒญ, ์ฃผ์†Œ์ฐฝ, ์ฆ๊ฒจ์ฐพ๊ธฐ, ํˆด๋ฐ”
  • DOM Document ๊ฐ์ฒด

[์ฐธ๊ณ ] Node.js์—์„œ์˜ ์ „์—ญ ๊ฐ์ฒด

node์—์„œ์˜ ์ „์—ญ ๊ฐ์ฒด: global

Node.js์—์„œ์˜ ์ „์—ญ ๊ฐ์ฒด

globalThis

ํ™˜๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ „์—ญ ๋ฒ”์œ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ES2020์—์„œ ์ถ”๊ฐ€๋œ ์‚ฌ์–‘. (IE ๋นผ๊ณ  ์ž˜ ๋œ๋‹ค.)

// ๋ธŒ๋ผ์šฐ์ €
globalThis === window; // true
// Node.js
globalThis === global; // true

โ— ํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ์ •๋ฆฌํ•˜์ž

Arrow Function(ํ™”์‚ดํ‘œ ํ•จ์ˆ˜) (ES6 ๋ฌธ๋ฒ•)

  • ํ•ญ์ƒ ์ต๋ช…์ด๋‹ค.
// ์ผ๋ฐ˜ ํ•จ์ˆ˜
var foo = function () {
  console.log('foo');
};

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
var bar = () => console.log('bar'); // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

  • ๊ธฐ๋ณธ ํ˜•ํƒœ
(function () {
  // statements
})();

Comment

Reference

ํŒ€์›๋“ค ๊ฒฐ๊ณผ๋ฌผ

๋ฉด์ ‘ ์งˆ๋ฌธ

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

๋ณ€์ˆ˜์˜ ์„ ์–ธ๋ถ€๋‚˜ ํ•จ์ˆ˜๊ฐ€ ํ˜„์žฌ ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ํ˜„์ƒ. ์‹ค์ œ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‚˜ js๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•ด์„ํ•œ๋‹ค๋Š” ๋œป.

Q.function foo(){}์™€ var foo = function(){} ์‚ฌ์ด์—์„œ foo ์‚ฌ์šฉ๋ฒ•์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ์ „์ž๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ. ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๊ธฐ๋•Œ๋ฌธ์— ์ด ํ•จ์ˆ˜์„ ์–ธ๋ฌธ ์ „์— foo๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.
  • ํ›„์ž๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹. ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์ด์ „์— foo๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ.

Q. let, var ๋˜๋Š” const ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜๋“ค์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • var: ์žฌ์„ ์–ธ ๊ฐ€๋Šฅ, ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„. ์„ ์–ธ ์ „์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผํ•จ
  • let, const: ์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€. ๋ธ”๋ก ์Šค์ฝ”ํ”„. let์€ ์žฌํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‚˜, const๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜์ž„. ๋˜ํ•œ const๋Š” ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ํ•ด์•ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Œ.(let์€ ์ดˆ๊ธฐํ™”์—†์ด ์„ ์–ธ๋งŒ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง„ ์•Š๊ณ  undefined๊ฐ€ ์ž๋™์œผ๋กœ ํ• ๋‹น๋จ.)

  • ํด๋กœ์ €๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์™œ ์“ฐ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•„๋ผ
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ ์ผ๋ฐ˜ํ•จ์ˆ˜์™€์˜ ์ฐจ์ด์ ์€?
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” ๋ฌด์—‡์ธ๊ฐ€?
์ „์—ญ ๊ณต๊ฐ„์—์„œ window
ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ window
๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ฃผ์ฒด
์ฝœ๋ฐฑ์—์„œ window - ํ•˜์ง€๋งŒ this๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์„œ ๋„˜๊ธฐ๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ๋‹ค.
์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ ์ธ์Šคํ„ด์Šค
  • Function.prototype.bind์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • ์—„๊ฒฉ๋ชจ๋“œ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ์ง€?

  • ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?