Scope (๋ฒ”์œ„) ํ•™์Šต

1. ์Šค์ฝ”ํ”„๊ฐ€ ๋Œ€์ฒด ๋ญ์ง€? ๋ฐฐ๊ทธ์˜ ๊ทธ ์Šค์ฝ”ํ”„ ์ธ๊ฐ€..

q1

greetSomeone(); ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ฒ”์œ„ ๋ฐ”๊นฅ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฒ”์œ„ ์•ˆ์œผ๋กœ ๊ฐ€์ ธ์™€ ์“ธ ์ˆ˜ ์žˆ๊ตฌ๋‚˜. ํ•ด์„œ Hello Josh ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

firstName(); ์ด๊ฑฐ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ReferenceError ๋ฅผ ์ผ์œผํ‚ค๋Š”๋ฐ,

firstName is not defined ๋ผ๋ฉด์„œ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ๋‚ด ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฒ”์œ„ ๋ฐ”๊นฅ์—์„œ ์จ๋จน์„ ์ˆ˜ ์—†๋‹ค ๋ผ๋Š” ์˜๋ฏธ์ธ๋ฐ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ ๋ˆˆ์— ์•ˆ๋ณด์ด๋Š” ๋ฐ”์šด๋”๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

localscope

์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด๋“ฏ์ด,

  1. ๋ณ€์ˆ˜ firstName ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ์กด์žฌํ•˜๋ฉฐ
  2. Local Scope ์•ˆ์ชฝ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ฐ–์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

2. Scope ์˜ ์ •์˜

ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž์‹ ๋งŒ์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ•จ์ˆ˜ ์•ˆ์ชฝ์—์„œ๋งŒ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค.

Scope ๋Š” ๋ณ€์ˆ˜ ์ ‘๊ทผ ๊ทœ์น™์— ๋”ฐ๋ฅธ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋œปํ•œ๋‹ค.

  • ๋ณ€์ˆ˜๋Š” ์–ด๋– ํ•œ ํ™˜๊ฒฝ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜ ์ ‘๊ทผ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค ํ•œ๋‹ค.
  • ๋ณ€์ˆ˜์™€ ๊ทธ ๊ฐ’์ด, ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€ ์œ ํšจํ•œ์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋œปํ•œ๋‹ค.
  • Javascript ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ, ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๋Š” (lexical) ๋™์‹œ์— ์ž์‹ ๋งŒ์˜ scope ๋ฅผ ๊ฐ€์ง„๋‹ค.

Rule 1 : Local vs Global

local global

- ์•ˆ์ชฝ scope ์—์„œ ๋ฐ”๊นฅ ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.
- ๋ฐ”๊นฅ์ชฝ scope ์—์„œ ์•ˆ์ชฝ ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.
: ์ฆ‰, local scope ์— ์ •์˜๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊นฅ์ชฝ์—์„œ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • scope ๋Š” ์ค‘์ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ฒ„๋ธ” ๊ฐ™์ด, ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.)
  • Global Scope ๋Š” ์ตœ์ƒ๋‹จ์˜ scope ๋กœ, ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์–ด๋””์„œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. : ์ฆ‰ inner ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ž„์˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ, ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์ฐธ๊ณ ํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ณ , ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฐธ์กฐํ•ด ๊ฐ–๊ณ  ์˜ค๋Š” ๋Š๋‚Œ์ธ ๊ฑฐ ๊ฐ™๋‹ค.

q2

์ˆœ์„œ๋Œ€๋กœ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถ”๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ€์กŒ๋‹ค.

์—ฌ๊ธฐ์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๋Š” ๋ฐ”๋กœ ์œ„ ๋งˆ์ง€๋ง‰ ์ •์˜๊ฐ€ ๋งž์•„ ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ 2์— ๋Œ€ํ•œ ํ•ด๋‹ต. q2a

๋ฌธ์ œ 3๋ฒˆ์€ ๋ฐ”๋กœ ์œ„์˜ ๋ฌธ์ œ 2๋ฒˆ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ ๋‚ด์˜ let ํ‚ค์›Œ๋“œ ์—†์ด โ€˜jackโ€™ ์„ name ์— ํ• ๋‹นํ•˜์˜€๋‹ค. q3 ๊ทธ๋ž˜์„œ ์ฒ˜์Œ ์ฝ˜์†”๋กœ๊ทธ์—๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ธ name ์˜ ๊ฐ’ โ€œRichardโ€ ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋‚˜, ํ•จ์ˆ˜ showName() ์„ ์‹คํ–‰ํ•˜๋ฉด์„œ โ€œjackโ€ ์ด ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ console.log(name); ์€ ์ฒ˜์Œ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ „์—ญ ๋ณ€์ˆ˜ name ์„ ์ฐธ์กฐํ•˜๋Š”๋ฐ, ํ•จ์ˆ˜ showName() ์— ์˜ํ•ด ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์–ด ๋ฒ„๋ ค โ€œjackโ€ ์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฌธ์ œ 3์— ๋Œ€ํ•œ ํ•ด๋‹ต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. q3a

Rule 2 : Function Scope VS Block Scope

๋ธ”๋ก์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ์ฒจ์— ์˜์ƒ์„ ๋ณด๋ฉฐ ๋ฐœ์Œ์ด ์•ฝ๊ฐ„ ๋ถˆ๋‚™ ๊ฐ™์•„์„œ ๋‚˜๋Š” ๊ทธ ์œ ๋ช…ํ•œ ์ด๊ฒŒ ๋ถˆ๋‚™์ด์•ผ? ๋ฅผ ๋ฐ”๋กœ ๋– ์˜ฌ๋ ธ๋‹ค..

์Œ.. ์—ฌํŠผ..

  • Block : ์ค‘๊ด„ํ˜ธ (curly bracket) ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚˜๋Š” ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Function Scope ๋ž‘ Block Scope ๋ž‘ ๋ญ” ์ฐจ์ด์ง€?

๋ฐ”๋กœ ์ด์–ด์ง€๋Š” ํ€ด์ฆˆ 4๋ฒˆ์„ ํ’€์–ด๋ณด์•˜๋‹ค.

q4 ๋ฐ˜๋ณต๋ฌธ ์กฐ๊ฑด ๋‚ด์˜ ๋ณ€์ˆ˜๋ฅผ let i = 0 ์œผ๋กœ ํ–ˆ๋‹ค๋Š” ์ ์„ ๋ˆˆ์—ฌ๊ฒจ ๋ด์•ผ ํ•œ๋‹ค. ์•„๊นŒ ๋ฐฐ์› ๋“ฏ ๋ธ”๋ก ๋ฐ”๊นฅ์—์„œ i ๋ฅผ ์• ํƒ€๊ฒŒ ๋ถˆ๋Ÿฌ๋ด๋„ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚จ๋‹ค.

๋ฌธ์ œ 4์— ๋Œ€ํ•œ ํ•ด๋‹ต์ด๋‹ค. q4a block scope ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ฆ‰์‹œ ๋ณ€์ˆ˜ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š”๊ตฌ๋‚˜! ์•„๊นŒ ๋งจ ์ฒ˜์Œ์ฒ˜๋Ÿผ ReferenceError ๋ฅผ ์ผ์œผํ‚ค๋Š”๊ตฌ๋‚˜! ์ •์˜๋œ i ๋ฅผ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์™œ? let ํ‚ค์›Œ๋“œ๋กœ๋Š” block ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ๋ณ€์ˆ˜ i๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var ํ‚ค์›Œ๋“œ VS let ํ‚ค์›Œ๋“œ

๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋˜๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ. var

  • Javascript ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ, ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ž์‹ ๋งŒ์˜ scope ๋ฅผ ๊ฐ€์ง„๋‹ค.

    var ํ‚ค์›Œ๋“œ (Old way)

  • ๊ทธ๋Ÿฌ๋‚˜, Block ๋‹จ์œ„๋กœ scope ๋ฅผ ๊ตฌ๋ถ„ํ–ˆ์„ ๋•Œ์— ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    let ํ‚ค์›Œ๋“œ

q5 ๋ฌธ์ œ 5๋ฒˆ์„ ํ†ตํ•ด์„œ ๋ฐ˜๋ณต์— var i = 0 ์„ ์‚ฌ์šฉํ•œ ์ฝ˜์†” ์ถœ๋ ฅ์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•ด ๋ณด์•˜๋‹ค. 4๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ์ค„ ์•Œ์•˜๋‹ค.

var i = 0; ์œผ๋กœ ์„ ์–ธํ•œ ๋ฐ˜๋ณต๋ฌธ์ด๋‹ค. i ๋Š” ์ด์ œ block scope ๋‚ด ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,

ํ•˜๋‚˜์˜ function scope ์•ˆ์ชฝ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์—ฌ๊ธฐ ๋ฌธ์ œ์—์„œ๋Š” ๋”ฐ๋กœ function ๊ตฌ๋ถ„์€ ์—†๊ธฐ์—,
๊ทธ ์ž์ฒด๋กœ function scope ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

q5a

๊ทธ๋ฆฌ๊ณ  4๊ฐ€ ์•„๋‹Œ 5๊ฐ€ ๋œ ์ด์œ ๋Š”, 0,1,2,3,4 ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ์ฆ๊ฐ๋ฌธ i++ ๊นŒ์ง€ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 5๊ฐ€ ๋œ ๊ฒƒ์ด์˜€๋‹ค.

์–ธ๋œป var ์„ ์–ธ์ด ํŽธํ•˜๊ฒŒ ๋ณด์ด์ง€๋งŒ block ์•ˆ์ชฝ์— ์žˆ์–ด์•ผ๋งŒ ๊ทธ ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ๋ˆˆ์— ํ™• ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ ,

์œ„์˜ ๋ฌธ์ œ 5๋ฒˆ์˜ ๊ฒฝ์šฐ๋Š” i๋ฅผ ์˜ˆ์ƒ ๋ชปํ•˜๊ฒŒ ๋’ค์—์„œ๋„ ์“ฐ๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ var ๋ณด๋‹ค let ์„ ์“ด๋‹ค๊ณ  ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž ์ฝ˜์†”๋กœ ํ™•์ธํ•˜๋Š” var ํ‚ค์›Œ๋“œ์™€ let ํ‚ค์›Œ๋“œ

varvslet

๋‚˜๋Š” ์˜ค๋ฅธ์ชฝ let ์—์„œ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ฌ ๊ฑฐ ๊ฐ™๋‹ค ์˜ˆ์ƒํ–ˆ๊ณ  ๋งž์•˜๋‹ค.

์œ„ ๊ทธ๋ฆผ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”๋กœ ์˜ฎ๊ฒจ๋ณด๋ฉด, scope ๋ผ๋Š” tab ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Local ์— 3๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • var : ํ•จ์ˆ˜ ๋‚ด ์ •์˜ ๋œ 3๊ฐœ์˜ ๋ณ€์ˆ˜. block ์•ˆ์— var greeting ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ˆˆ์—ฌ๊ฒจ ๋ณด์ž. ํ•จ์ˆ˜ ๋‚ด ์ •์˜ ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ local scope ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•˜๋‹ค.
  • let : block scope ๋ฅผ ๋”ฐ๋ฅด๋ฏ€๋กœ block ์•ˆ์— ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™ํžŒ๋‹ค. block ์•ˆ์— ์žˆ๋Š” greeting ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. let greeting ์€ ์•ˆ์ชฝ block ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

letinblock

block ์•ˆ์— debugger ์ž…๋ ฅ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ block ์˜ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, greeting ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น block ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. block scope ์•ˆ์—์„œ๋Š” local, global ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const ํ‚ค์›Œ๋“œ

๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜, ์ฆ‰ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ ๋ผ๊ณ  ํ•œ๋‹ค.

  • let ๊ณผ ๋™์ผํ•˜๊ฒŒ block scope ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
  • ๊ฐ’์„ ์žฌ์ •์˜ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด TypeError ๋ฅผ ๋‚ธ๋‹ค. ์ฆ‰ let ์ฒ˜๋Ÿผ ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅ! ํ•˜๋‹ค.
const pi = 3.14;
pi = 3.1415;

>>> Uncaught TypeError : Assignment to constant variable
: ์ฆ‰ ์ƒˆ๋กญ๊ฒŒ assignment ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. ๋ผ๋Š” ์˜๋ฏธ์˜ ์—๋Ÿฌ.

let, const ์˜ ๊ฐ’ ์žฌ์ •์˜ ์™€ ์žฌ์„ ์–ธ์˜ ์ฐจ์ด?

์žฌ์ •์˜๋Š” let ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. const ๋Š” ๋ฐ”๋กœ ์œ„์˜ ์˜ˆ์ฒ˜๋Ÿผ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทผ๋ฐ ์žฌ์„ ์–ธ์€ let ๊ณผ const ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

let num = 3.14;
let num = 8.15;

>>> SyntaxError 'num' has already been declared at
: const ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฏธ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๋˜ ์„ ์–ธํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

letconstvar

์ด๋ ‡๋“ฏ let ๊ณผ const ๋Š” ์žฌ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ var ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทผ๋ฐ ์‹ค์ œ ์ฝ”๋”ฉ์‹œ์— ์žฌ์„ ์–ธ์„ ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ๋ผ๊ณ  ์˜์ƒ์—์„œ ์„ค๋ช…ํ–ˆ๋‹ค. ๋ณดํ†ต ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋ฒ„๊ทธ์ด๊ณ  var ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ, let ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ๋ง‰์•„์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

var ๋ณด๋‹ค let ์„ ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๊ฐ€ ๋œ๋‹ค๊ณ  ํ• ๊นŒ?

Rule 3 : ์ „์—ญ๋ณ€์ˆ˜์™€ window ๊ฐ์ฒด

๊ฐœ๋ฐœ์ž ์ฝ˜์†”์— window ๋ผ ์“ฐ๊ณ  ์—”ํ„ฐ ์น˜๋ฉด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ž์„ธํžˆ ์—ด์–ด๋ณด๋ฉด ์ „๋ถ€ ์ „์—ญ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ํ‚ค๋“ค์ด ๋“ฑ์žฅํ•œ๋‹ค.

  • Global Scope ์—์„œ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋‚˜,
  • var ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š”

window ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.

  1. Global scope ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜ foo() : window ๋ฅผ ์น˜๊ณ  ๋“ค์–ด๊ฐ€๋ณด๋ฉด ๊ฐ์ฒด ๋‚ด์— foo ๋ผ๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
foo === window.foo() >>> true
  1. var myName = โ€œpaulโ€; : window ์น˜๊ณ  ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
myName === window.myName >>> true
  1. let yourName = โ€˜timโ€™; : window.yourName ์ณ๋ณด๋ฉด โ€œundefinedโ€ ๋ผ ๋œฌ๋‹ค. let ํ‚ค์›Œ๋“œ๋ฅผ ์ผ์„ ๋• window ๊ฐ์ฒด์—์„œ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

์ „์—ญ ๋ฒ”์œ„์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜

์ž˜์€ ์ดํ•ด ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ „์—ญ์€ ์ตœ์ƒ์œ„ scope ์˜์—ญ์ด๋‹ค. ์–ด๋–ค library ๊ฐ€ ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์“ธ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ํ˜น์‹œ๋‚˜ i ๋ผ๋Š” ์ด๋ฆ„์ด ๊ฒน์ณ์ง„๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ bracket ์•ˆ์— let ์„ ์„ ์–ธํ•ด (ํ•˜๋‚˜์˜ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค์–ด์„œ) ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

Rule 4 : ์„ ์–ธ ์—†์ด ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜

dontinitvar

์ ˆ๋Œ€๋กœ ์„ ์–ธ ํ‚ค์›Œ๋“œ ์—†์ด (var, let, const) ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ age = 90; ์€,

age === window.age

์™€ ๊ฐ™์œผ๋ฉฐ ์‹ฌ์ง€์–ด ์—๋Ÿฌ๋„ ์•ˆ๋– ์„œ ๊ทธ๋ž˜์„œ ๋” ์œ„ํ—˜ํ•˜๊ณ  ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ƒ๋‹จ์— โ€˜use strictโ€™; ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋„ฃ๋Š”๋‹ค.

strict mode ๋ฅผ ์‚ฌ์šฉํ•˜์ž

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ƒ๋‹จ์— ์ ํžŒ ๋ฌธ์ž์—ด, โ€˜use strictโ€™; ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์„ ์—๋Ÿฌ๋กœ ํŒ๋‹จํ•œ๋‹ค.

ํŒŒ์ผ์„ ์ €์žฅํ•œ ์ƒํƒœ์—์„œ๋งŒ strict mode ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด ์ง„๋‹ค.

์ฝ˜์†”์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ์€ ์•ˆ๋œ๋‹ค.

์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ age = 90; ๊ฐ™์€ ๋ฌธ์ œ๋ฃฐ Reference Error ๋ฅผ ์ผ์œผ์ผœ ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook