September 15, 2020
greetSomeone(); ์ ์คํํ์ ๋ ๋ฒ์ ๋ฐ๊นฅ์ ๋ณ์๋ฅผ ๋ฒ์ ์์ผ๋ก ๊ฐ์ ธ์ ์ธ ์ ์๊ตฌ๋. ํด์ Hello Josh ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
firstName(); ์ด๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ReferenceError ๋ฅผ ์ผ์ผํค๋๋ฐ,
firstName is not defined ๋ผ๋ฉด์ ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฌ๋ค. ์ฆ, ํจ์ ๋ด ์ ์๋ ๋ณ์๋ฅผ ๋ฒ์ ๋ฐ๊นฅ์์ ์จ๋จน์ ์ ์๋ค ๋ผ๋ ์๋ฏธ์ธ๋ฐ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ ๋์ ์๋ณด์ด๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋ค๊ณ ํ๋ค.
์ ๊ทธ๋ฆผ์์ ๋ณด๋ฏ์ด,
ํจ์๊ฐ ์์ฑ๋ ๋ ์์ ๋ง์ ๋ฒ์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํจ์ ์์ชฝ์์๋ง ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋ฐฐ์ ๋ค.
Scope ๋ ๋ณ์ ์ ๊ทผ ๊ท์น์ ๋ฐ๋ฅธ ์ ํจ ๋ฒ์๋ฅผ ๋ปํ๋ค.
- ์์ชฝ scope ์์ ๋ฐ๊นฅ ๋ณ์/ํจ์ ๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
- ๋ฐ๊นฅ์ชฝ scope ์์ ์์ชฝ ๋ณ์/ํจ์ ๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ ํ๋ค.
: ์ฆ, local scope ์ ์ ์๋ ๋ณ์๋ฅผ ๋ฐ๊นฅ์ชฝ์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์์๋๋ก ์ฝ์์ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง ์ถ๋ฆฌํ๋ ๊ณผ์ ์ ๊ฐ์ก๋ค.
์ฌ๊ธฐ์ ์ง์ญ ๋ณ์๋ ํญ์ ์ ์ญ ๋ณ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค๋ ๋ฐ๋ก ์ ๋ง์ง๋ง ์ ์๊ฐ ๋ง์ ๋จ์ด์ง๋ค๋ ๊ฒ์ ์ฒด๊ฐํ ์ ์๋ค.
๋ฌธ์ 2์ ๋ํ ํด๋ต.
๋ฌธ์ 3๋ฒ์ ๋ฐ๋ก ์์ ๋ฌธ์ 2๋ฒ๊ณผ ๋น์ทํ์ง๋ง, ํจ์ ๋ด์ let ํค์๋ ์์ด โjackโ ์ name ์ ํ ๋นํ์๋ค. ๊ทธ๋์ ์ฒ์ ์ฝ์๋ก๊ทธ์๋ ์ ์ญ ๋ณ์์ธ name ์ ๊ฐ โRichardโ ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋, ํจ์ showName() ์ ์คํํ๋ฉด์ โjackโ ์ด ์ถ๋ ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง console.log(name); ์ ์ฒ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ญ ๋ณ์ name ์ ์ฐธ์กฐํ๋๋ฐ, ํจ์ showName() ์ ์ํด ์ ์ญ ๋ณ์๊ฐ ๋ฐ๋์ด ๋ฒ๋ ค โjackโ ์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
๋ฌธ์ 3์ ๋ํ ํด๋ต์ ์๋์ ๊ฐ๋ค.
๋ธ๋ก์ด๋ ๋ฌด์์ธ๊ฐ? ์ฒจ์ ์์์ ๋ณด๋ฉฐ ๋ฐ์์ด ์ฝ๊ฐ ๋ถ๋ ๊ฐ์์ ๋๋ ๊ทธ ์ ๋ช ํ ์ด๊ฒ ๋ถ๋์ด์ผ? ๋ฅผ ๋ฐ๋ก ๋ ์ฌ๋ ธ๋ค..
์.. ์ฌํผ..
๊ทธ๋ฌ๋ฉด Function Scope ๋ Block Scope ๋ ๋ญ ์ฐจ์ด์ง?
๋ฐ๋ก ์ด์ด์ง๋ ํด์ฆ 4๋ฒ์ ํ์ด๋ณด์๋ค.
๋ฐ๋ณต๋ฌธ ์กฐ๊ฑด ๋ด์ ๋ณ์๋ฅผ let i = 0 ์ผ๋ก ํ๋ค๋ ์ ์ ๋์ฌ๊ฒจ ๋ด์ผ ํ๋ค. ์๊น ๋ฐฐ์ ๋ฏ ๋ธ๋ก ๋ฐ๊นฅ์์ i ๋ฅผ ์ ํ๊ฒ ๋ถ๋ฌ๋ด๋ ์ฐพ์ ์๊ฐ ์๋ค. ์๋ฌ๋ฅผ ์ผ์ผํจ๋ค.
๋ฌธ์ 4์ ๋ํ ํด๋ต์ด๋ค. block scope ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ฆ์ ๋ณ์ ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋๊ตฌ๋! ์๊น ๋งจ ์ฒ์์ฒ๋ผ ReferenceError ๋ฅผ ์ผ์ผํค๋๊ตฌ๋! ์ ์๋ i ๋ฅผ ์ฐพ์ ์๊ฐ ์๋ค. ์? let ํค์๋๋ก๋ block ๋ฒ์ ์์์๋ง ๋ณ์ i๋ฅผ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณ์๋ฅผ ์ ์ํ๋ ๋๋ค๋ฅธ ํค์๋. var
Javascript ๋ ๊ธฐ๋ณธ์ ์ผ๋ก, ํจ์ ๋จ์๋ก ์์ ๋ง์ scope ๋ฅผ ๊ฐ์ง๋ค.
var ํค์๋ (Old way)
๊ทธ๋ฌ๋, Block ๋จ์๋ก scope ๋ฅผ ๊ตฌ๋ถํ์ ๋์ ์์ธกํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ํ๋ค.
let ํค์๋
๋ฌธ์ 5๋ฒ์ ํตํด์ ๋ฐ๋ณต์ var i = 0 ์ ์ฌ์ฉํ ์ฝ์ ์ถ๋ ฅ์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํด ๋ณด์๋ค. 4๊ฐ ์ถ๋ ฅ๋๋ ์ค ์์๋ค.
var i = 0; ์ผ๋ก ์ ์ธํ ๋ฐ๋ณต๋ฌธ์ด๋ค. i ๋ ์ด์ block scope ๋ด ์์๋ง ์ธ ์ ์๋ ๊ฒ ์๋๋ผ,
ํ๋์ function scope ์์ชฝ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ฌ๊ธฐ ๋ฌธ์ ์์๋ ๋ฐ๋ก function ๊ตฌ๋ถ์ ์๊ธฐ์,
๊ทธ ์์ฒด๋ก function scope ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ 4๊ฐ ์๋ 5๊ฐ ๋ ์ด์ ๋, 0,1,2,3,4 ํ๊ณ ๋ง์ง๋ง ์ฆ๊ฐ๋ฌธ i++ ๊น์ง ํ๊ธฐ ๋๋ฌธ์ 5๊ฐ ๋ ๊ฒ์ด์๋ค.
์ธ๋ป var ์ ์ธ์ด ํธํ๊ฒ ๋ณด์ด์ง๋ง block ์์ชฝ์ ์์ด์ผ๋ง ๊ทธ ๋ณ์์ ์ ํจ ๋ฒ์๊ฐ ๋์ ํ ๋ค์ด์ฌ ์ ์๊ณ ,
์์ ๋ฌธ์ 5๋ฒ์ ๊ฒฝ์ฐ๋ i๋ฅผ ์์ ๋ชปํ๊ฒ ๋ค์์๋ ์ฐ๊ฑฐ๋ ์ฌ์ฌ์ฉ ํ ์ ์๋ ์ํ์ฑ์ด ์กด์ฌํ๋ค๊ณ ํ๋ค.
๊ทธ๋์ var ๋ณด๋ค let ์ ์ด๋ค๊ณ ํ๋ค.
๋๋ ์ค๋ฅธ์ชฝ let ์์ ์๋ฌ๋ฅผ ์ผ์ผํฌ ๊ฑฐ ๊ฐ๋ค ์์ํ๊ณ ๋ง์๋ค.
์ ๊ทธ๋ฆผ์ ์ฝ๋๋ฅผ ๊ฐ๋ฐ์ ์ฝ์๋ก ์ฎ๊ฒจ๋ณด๋ฉด, scope ๋ผ๋ tab ์ ํ์ธํ ์๊ฐ ์๋ค. ์ฌ๊ธฐ์์ Local ์ 3๊ฐ์ ๋ณ์๊ฐ ๋ด๊ฒจ ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
block ์์ debugger ์ ๋ ฅ์ ํตํด ๊ฐ๋ฐ์ ์ฝ์์์ block ์ ๋ณ์๋ฅผ ํ์ธํ ์ ์๋ค.
์ฆ, greeting ๋ณ์๋ ํด๋น block ์์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. block scope ์์์๋ local, global ๋ณ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ์ด ๋ณํ์ง ์๋ ๋ณ์, ์ฆ ์์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ํค์๋ ๋ผ๊ณ ํ๋ค.
const pi = 3.14;
pi = 3.1415;
>>> Uncaught TypeError : Assignment to constant variable
: ์ฆ ์๋กญ๊ฒ assignment ๋ฅผ ํ ์ ์๋ค. ๋ผ๋ ์๋ฏธ์ ์๋ฌ.
์ฌ์ ์๋ let ์ ๊ฐ๋ฅํ๋ค. const ๋ ๋ฐ๋ก ์์ ์์ฒ๋ผ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทผ๋ฐ ์ฌ์ ์ธ์ let ๊ณผ const ๋ชจ๋ ๋ถ๊ฐ๋ฅํ๋ค.
let num = 3.14;
let num = 8.15;
>>> SyntaxError 'num' has already been declared at
: const ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฏธ ์ ์ธ๋ ๋ณ์๋ฅผ ๋ ์ ์ธํ ์๊ฐ ์๋ค.
์ด๋ ๋ฏ let ๊ณผ const ๋ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง var ์ ๊ฐ๋ฅํ๋ค.
๊ทผ๋ฐ ์ค์ ์ฝ๋ฉ์์ ์ฌ์ ์ธ์ ํด์ผ ํ ํ์๊ฐ ์์๊น ๋ผ๊ณ ์์์์ ์ค๋ช ํ๋ค. ๋ณดํต ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ ๋ฒ๊ทธ์ด๊ณ var ํค์๋๊ฐ ์๋, let ํค์๋๋ฅผ ํตํด ์ด๋ฌํ ์ค์๋ฅผ ๋ง์์ค๋ค๊ณ ํ๋ค.
var ๋ณด๋ค let ์ ์ถ์ฒํ๋ ์ด์ ๊ฐ ๋๋ค๊ณ ํ ๊น?
๊ฐ๋ฐ์ ์ฝ์์ window ๋ผ ์ฐ๊ณ ์ํฐ ์น๋ฉด ์ด๋ค ๊ฐ์ฒด๊ฐ ๋์ค๋๋ฐ, ์์ธํ ์ด์ด๋ณด๋ฉด ์ ๋ถ ์ ์ญ์ ์ธ ์ ์๋ ํค๋ค์ด ๋ฑ์ฅํ๋ค.
window ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋๋ค.
foo === window.foo() >>> true
myName === window.myName >>> true
์์ ์ดํด ๋์ง ์๋๋ฐ, ์ ์ญ์ ์ต์์ scope ์์ญ์ด๋ค. ์ด๋ค library ๊ฐ ์ด๋ค ๋ณ์๋ฅผ ์ธ ์ง ์ ์ ์์ผ๋ฏ๋ก, ํน์๋ i ๋ผ๋ ์ด๋ฆ์ด ๊ฒน์ณ์ง๋ค๋ฉด ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค ํ๋ค.
๊ทธ๋์ bracket ์์ let ์ ์ ์ธํด (ํ๋์ ์ค์ฝํ๋ฅผ ๋ง๋ค์ด์) ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒ ์ข๋ค๊ณ ํ๋ค.
์ ๋๋ก ์ ์ธ ํค์๋ ์์ด (var, let, const) ๋ณ์๋ฅผ ์ด๊ธฐํ ํ์ง ๋ง๋ผ๊ณ ํ๋ค.
์์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ age = 90; ์,
age === window.age
์ ๊ฐ์ผ๋ฉฐ ์ฌ์ง์ด ์๋ฌ๋ ์๋ ์ ๊ทธ๋์ ๋ ์ํํ๊ณ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ผ ํ๋ค.
์ด๋ฌํ ์ค์๋ฅผ ๋ฐฉ์งํ๊ณ ์ถ์ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์๋จ์ โuse strictโ; ๋ผ๋ ๋ฌธ์์ด์ ๋ฃ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์๋จ์ ์ ํ ๋ฌธ์์ด, โuse strictโ; ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์ค์ํ ์ ์๋ ๋ถ๋ถ๋ค์ ์๋ฌ๋ก ํ๋จํ๋ค.
ํ์ผ์ ์ ์ฅํ ์ํ์์๋ง strict mode ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด ์ง๋ค.
์ฝ์์์ ๋ฐ๋ก ์ฌ์ฉ์ ์๋๋ค.
์๋ํ์ง ์๊ฒ age = 90; ๊ฐ์ ๋ฌธ์ ๋ฃฐ Reference Error ๋ฅผ ์ผ์ผ์ผ ๊ฑธ๋ฌ๋ผ ์ ์๋ค.