์์ ๊ธ์ ์๋์์๋ ์ธ๊ธํ๋ค์ํผ, GitHub์ ์๋ 33 Concepts Every JavaScript Developer Should Know ๋ผ๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ด์ฉ ์ค ๊ณต๋ถํ๊ณ ์ถ์ ์ํฐํด์ ๋ด๊ฐ ์ ๋ฆฌํ ๊ฒธ ๊ธฐ์ตํ ๊ฒธ ์์ฑํ๋ ๋ฒ์ญ๊ธ์ด๋ค. 33๊ฐ์ง ์ค ์ฒซ ๋ฒ์งธ์ธ ํธ์ถ ์คํ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ด๋ค.
โป ๋ด๋ณด๋ด๋ฒ(๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ด๊ฐ ๋ฒ์ญํ): ์์ด ์ ๊ณต์๋ ํด์ธ ์ ํํ๋ ์๋๊ธฐ์ ๋ฒ์ญ์๋ ์์ญ, ์ค์ญ, ๊ตฌ๊ธ ๋ฒ์ญ์ด ๋ฌด์ํ ๋ง์ ์ ์์ผ๋ฉฐ, ์คํ๋ ๋ง์ ์ ์๋ค. ์ ํํ ๋ด์ฉ์ ์๋ฌธ์ ์ง์ ์ดํด๋ณด๊ฑฐ๋ ๋ค๋ฅธ ์ ๋ณด๋ค์ ๋ ์ฐพ์๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
(ํ์ง๋ง ๋๊ธ ํผ๋๋ฐฑ๋ ํ์ํฉ๋๋ค๐ )
์ด๋ฒ์ ๊ณ ๋ฅธ ์ํฐํด์ Tyler McGinnis ๋์ด ์์ฑํ์ The Ultimate Guide to Hoisting, Scopes, and Closures in JavaScript ์ด๋ค.
๋๋๊ฒ ๋ณด์ผ ์๋ ์์ง๋ง ๋ด ์๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํ ๊ฐ์ฅ ์ค์ํ๊ณ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๋ ๊ฒ์ด๋ค. ์ ๋๋ก ๋ฐฐ์ฐ๋ฉด ํธ์ด์คํ , ์ค์ฝํ ์ฒด์ธ, ํด๋ก์ ์ ๊ฐ์ ๋ ๊ณ ๊ธ ํ ํฝ์ ์ ๋ฐฐ์ธ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ์ด ์ ์ ์ผ๋์ ๋๊ณ "์คํ ์ปจํ ์คํธ"๋ ์ ํํ ๋ฌด์์ธ๊ฐ? ๋ ์ ์ดํดํ๊ธฐ ์ํด์ ๋จผ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์ํํธ์จ์ด๋ฅผ ์์ฑํ๋์ง ์ดํด๋ณด์.
์ํํธ์จ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ ๊ฐ์ง ์ ๋ต์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ๋ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฌํ "์กฐ๊ฐ๋ค"์ ๋ง์ ๋ค๋ฅธ ์ด๋ฆ์ (ํจ์, ๋ชจ๋, ํจํค์ง ๋ฑ) ๊ฐ์ง๊ณ ์๋ค. ์ด๊ฒ๋ค์ ๋ชจ๋ ํ ๊ฐ์ง ๋ชฉ์ ์ ์ํด์ ์กด์ฌํ๋ค - ์ฐ๋ฆฌ ๋ถ๋ฆฌํ๊ณ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํจ์ด๋ค. ์ด์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ฌ๋์ฒ๋ผ ์๊ฐํ๋ ๋์ , ์ฝ๋๋ฅผ ํด์ํ๋ ์์ ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ํด ์๊ฐํ๋ผ. ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ฐฉ๋ฒ์ธ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ๋ต์ ์ฌ์ฉํ์ฌ ํด์ํ๋ ์ฝ๋์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ ์ ์๋๊ฐ? ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์๊ณ ์ด๋ฌํ "์กฐ๊ฐ๋ค"์ ์คํ ์ปจํ ์คํธ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํจ์/๋ชจ๋/ํจํค์ง๊ฐ ์์ฑํ ์ฝ๋์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ ๊ฐ์ด, ์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋ ํด์ ๋ฐ ์คํ์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์คํ ์ปจํ ์คํธ์ ๋ชฉ์ ์ ๋ํด ์์๋ค. ์ฐ๋ฆฌ๊ฐ ๋ค์์ ๋๋ตํด์ผ ํ ์ง๋ฌธ์ ์คํ ์ปจํ ์คํธ๋ ์ด๋ป๊ฒ ์์ฑ๋๊ณ ๋ฌด์์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋๋๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋น์ ์ ์ฝ๋๋ฅผ ์คํํ ๋ ์์ฑ๋๋ ์ฒซ ๋ฒ์งธ ์คํ ์ปจํ ์คํธ๋ "์ ์ญ ์คํ ์ปจํ ์คํธ(Global Execution Context)"์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์คํ ์ปจํ ์คํธ๋ ์ ์ญ ๊ฐ์ฒด์ this๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ณ์ ๋ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋๋ค. this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ ๊ฒฝ์ฐ์ ์ ์ญ ๊ฐ์ฒด๋ window๊ฐ, Node ํ๊ฒฝ์์ ์คํํ๋ ๊ฒฝ์ฐ์๋ global์ด ๋ ๊ฒ์ด๋ค.
์์ ๊ทธ๋ฆผ์์๋ ์ฝ๋ ํ ์ค ์์ด๋ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์ฌ์ ํ window์ this ๋ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๊ฒ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ์ ์ ์ญ ์คํ ์ปจํ์คํธ์ด๋ค.
ํ ๋จ๊ณ ๋ ๋์๊ฐ์ ์ฐ๋ฆฌ์ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ถ๊ฐํ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํด๋ณด์. ๋ช ๊ฐ์ง ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์์ํด๋ณด์.
์์ ๋ ์ด๋ฏธ์ง์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์์์ฑ๋๊ฐ? ํต์ฌ์ ๊ฐ ์คํ ์ปจํ ์คํธ์ ๋ ๊ฐ์ ๊ฐ๋ณ ๋จ๊ณ๊ฐ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ฆ ์์ฑ(Creation) ๋จ๊ณ์ ์คํ(Execution) ๋จ๊ณ์ด๊ณ ๊ฐ ๋จ๊ณ๋ณ๋ก ๊ณ ์ ํ ์ฑ ์์ด ์๋ค.
์ ์ญ ์์ฑ(Global Creation) ๋จ๊ณ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
- ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑ
- "this"๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
- ๋ณ์์ ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์
- ํจ์ ์ ์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๋ ๋์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ๊ฐ "undefined"๋ฅผ ํ ๋น
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ํ ์ค์ฉ ์คํํ๊ณ ์คํํ๊ธฐ ์์ํ๋ ์คํ ๋จ๊ณ๊น์ง๋ ์๋๋ค. (?)
์์ฑ ๋จ๊ณ์์ ์คํ ๋จ๊ณ๊น์ง์ ํ๋ฆ์ ์๋์ GIF์์ ๋ณผ ์ ์๋ค.
์์ฑ ๋จ๊ณ ๋์์ window์ this๊ฐ ์์ฑ๋๊ณ ๋ณ์ ์ ์ธ(name๊ณผ handle)์ ๊ธฐ๋ณธ ๊ฐ์ธ undefined๊ฐ ํ ๋น๋๋ฉฐ ๋ชจ๋ ํจ์ ์ ์ธ(getUser)์ด ์์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ๋จ๊ณ์ ๋ค์ด๊ฐ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์คํํ๊ธฐ ์์ํ๊ณ ์ค์ ๊ฐ์ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ณ์์ ํ ๋นํ๋ค.
GIF๊ฐ ๋ฉ์ง๊ธด ํ์ง๋ง ์ค์ค๋ก ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํด๋ณด๋ฉด์ ๊ณผ์ ์ ์ดํด๋ณด๋ ๊ฒ๋งํผ ๋ฉ์ง์ง ์๋ค. ๋น์ ์ด ๊ทธ๋ด ์๊ฒฉ์ด ์๊ธฐ ๋๋ฌธ์, ๋๋ ๋น์ ์ ์ํด JavaScript Visualizer*๋ฅผ ๋ง๋ค์๋ค. ๋ง์ฝ ์์ ๋์ผํ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํด๋ณด๊ณ ์ถ์ผ๋ฉด ์ด ๋งํฌ**๋ฅผ ์ฌ์ฉํ๋ผ.
*JavaScript Visualizer
** ์ฝ๋ ๋งํฌ
์์ฑ ๋จ๊ณ์ ์คํ ๋จ๊ณ์ ๋ํ ๊ฐ๋ ์ ํ๊ณ ํ ํ๊ธฐ ์ํด ์์ฑ ๋จ๊ณ ํ์ ์คํ ๋จ๊ณ ์ ์ ๋ช ๊ฐ์ง ๊ฐ์ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ๋ณด์.
console.log('name: ', name)
console.log('handle: ', handle)
console.log('getUser :', getUser)
var name = 'Tyler'
var handle = '@tylermcginnis'
function getUser () {
return {
name: name,
handle: handle
}
}
์์ ์ฝ๋์์ ์ฝ์์ ๋ฌด์์ด ์ฐํ ๊ฒ์ผ๋ก ์์ํ๋๊ฐ? ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์คํํ๊ณ console.log ํธ์ถ์ ์์ํ ๋๋ ์์ฑ ๋จ๊ณ๊ฐ ์ด๋ฏธ ์์์ด ๋์๋ค. ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ ์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ๋ณ์ ์ ์ธ์๋ undefined ๊ฐ์ด ํ ๋น๋์ด์ผ ํ๊ณ ํจ์ ์ ์ธ์ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์์ํ ๊ฒ์ฒ๋ผ name๊ณผ handle์ undefined ๊ทธ๋ฆฌ๊ณ getUser๋ ๋ฉ๋ชจ๋ฆฌ์ ํจ์์ ๋ํ ์ฐธ์กฐ์ด๋ค.
console.log('name: ', name) // name: undefined
console.log('handle: ', handle) // handle: undefined
console.log('getUser :', getUser) // getUser: ƒ getUser () {}
var name = 'Tyler'
var handle = '@tylermcginnis'
function getUser () {
return {
name: name,
handle: handle
}
}
์์ฑ ๋จ๊ณ ๋์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ๊ฐ์ธ undefined๋ฅผ ํ ๋นํ๋ ๊ณผ์ ์ ํธ์ด์คํ (Hoisting)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฐฉ๊ธ '์ํ!' ํ๋ ์๊ฐ์ด ์์๊ธธ ๋ฐ๋๋ค. ์์ ์ "ํธ์ด์คํ "์ ๋ํ ๊ทธ๋ค์ง ๋ง์กฑ์ค๋ฝ์ง ์์ ์ค๋ช ์ ๋ค์์ ์ ์๋ค. "ํธ์ด์คํ "์ ๋ํด์ ํท๊ฐ๋ฆฌ๊ฒ ๋ง๋๋ ๊ฒ์ ์ค์ ๋ก๋ ์๋ฌด๊ฒ๋ "๋ค์ด์ฌ๋ ค" ์ง๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ด์ ๋ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ ๋์์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ๊ฐ์ธ undefined๊ฐ ํ ๋น๋๋ค๋ ๊ฒ์ ์ดํดํ๊ณ , "ํธ์ด์คํ "์ ๋ํด์ ์ดํดํ๋ค. ๋ง ๊ทธ๋๋ก ๊ทธ๊ฒ ์ ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์์ ์์ ๋น์ ์ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๊ทธ๊ฒ์ ๋ ๊ฐ์ง ๋จ๊ณ, ์ฆ ์์ฑ ๋จ๊ณ์ ์คํ ๋จ๊ณ์ ๋ํด ๊ฝค ์ต์ํด์ ธ ์์ด์ผ ํ๋ค. ์ข์ ์์์ ๋น์ ์ด ๋ฐฐ์์ผ ํ๋ ์คํ ์ปจํ ์คํธ๊ฐ ๋ฑ ํ ๊ฐ์ง ๋ ์๋ค๋ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๊ฑฐ์ ๋์ผํ๋ค. ์ด๊ฒ์ ํจ์ ์คํ ์ปจํ ์คํธ๋ผ๊ณ ๋ถ๋ฆฌ๊ณ ํจ์๊ฐ ํธ์ถ๋ ๋ ์์ฑ์ด ๋๋ค.
์ด๊ฒ์ด ํต์ฌ์ด๋ค. ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ ์ ์ผํ ๊ฒฝ์ฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋ ํด์์ ์ฒ์ ์์ํ์ ๋ (์ ์ญ ์คํ ์ปจํ ์คํธ) ๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ํธ์ถ๋์์ ๋์ด๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ๋๋ตํด์ผ ํ๋ ์ฃผ๋ ์ง๋ฌธ์ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ํจ์ ์คํ ์ปจํ ์คํธ์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ๊ฐ ํ๋ ๊ฒ์ด๋ค. ์ข ์ ์ ์ ์ญ ์์ฑ ๋จ๊ณ ๋ถ๋ถ์์ ์ด์ผ๊ธฐํ ๊ฒ์ ๊ธฐ์ตํ๋ค๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
- ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑ
- "this"๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
- ๋ณ์์ ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์
- ํจ์ ์ ์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๋ ๋์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ๊ฐ "undefined"๋ฅผ ํ ๋นํ๋ค.
์ฐ๋ฆฌ๊ฐ ํจ์ ์คํ ์ปจํ ์คํธ์ ๋ํด์ ์ด์ผ๊ธฐํ ๋ ์์ ๋จ๊ณ๋ค ์ค ์ด๋ ๋จ๊ณ๊ฐ ๋ง์ด ์ ๋ ๊น? ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ด๋ค. ํจ์๊ฐ ํธ์ถ๋๊ณ JavaScript ์์ง์ด ํจ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ๋๋ง๋ค๊ฐ ์๋๋ผ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ ์ค์ ๋ง๋ค์ด์ง ์ ์ญ ๊ฐ์ฒด ํ๋๋ง ์์ด์ผ ํ๋ค. ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ ์ ํจ์ ์คํ ์ปจํ ์คํธ๋ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์ธ์๊ฐ ์๋๋ผ๋ ์ ์ ๋ํด ๊ณ ๋ คํดํ๋ค. ์ด ์ ์ ์ผ๋์ ๋๊ณ , ์ฐ๋ฆฌ๋ ์ด์ ๋ถํฐ ์ฐ๋ฆฌ์ ๋ชฉ๋ก์ ์์ ํ ์ ์๋ค. (?) ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑ- "this"๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
- ๋ณ์์ ํจ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์
- ํจ์ ์ ์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๋ ๋์ ๋ณ์ ์ ์ธ์ ๊ธฐ๋ณธ๊ฐ "undefined"๋ฅผ ํ ๋นํ๋ค.
์ด๊ฒ์ ์ค์ ๋ก ๋ณด๋ ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋จผ์ ๋ดค๋ ์ฝ๋๋ก ๋์๊ฐ์. ํ์ง๋ง ์ด๋ฒ์ getUser๋ฅผ ๋จ์ง ์ ์ํ๊ธฐ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ํธ์ถํ ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ํจ๊ป ์ดํด๋ณด์.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๊ฐ getUser๋ฅผ ํธ์ถํ ๋ ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค. getUser์ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ธ์์ ํจ๊ป this ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. getUser๋ ๋ค๋ฅธ ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์ ํ๊ฑฐ๋ ์ด๋ค ๋ณ์ ์ ์ธ์ "ํธ์ด์คํ "ํ ํ์๊ฐ ์๋ค.
์๋ง๋ getUser ํจ์๊ฐ ์คํ์ ์ข ๋ฃํ์ ๋๋ฅผ ์ ์ํด๋ณด์์ ์ ์๋๋ฐ, ์๊ฐํ์์ ์ ๊ฑฐ๋๋ค. ์ค์ ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์คํ(๋๋ ํธ์ถ ์คํ) ์ด๋ผ๋ ๊ฒ์ ์์ฑํ๋ค. ์ธ์ ๋ ํจ์๊ฐ ํธ์ถ๋๋ฉด, ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ํธ์ถ ์คํ์ ์ถ๊ฐ๋๋ค. ํจ์์ ์์ฑ๊ณผ ์คํ ๋จ๊ณ ๋ชจ๋ ์งํ ํ ์ข ๋ฃ๋๋ฉด ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋ (์ฆ ํ ๋ฒ์ ํ ๊ฐ์ง ์ผ๋ง ์คํ๋ ์ ์๋ค๋ ์๋ฏธ)์ด๊ธฐ ๋๋ฌธ์ ์๊ฐํ๋๊ธฐ ์ฝ๋ค. "JavaScript Visualizer"๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์ถ ์คํ์ด ์ค์ฒฉ๋ ๋ฐฉ์์ผ๋ก ํ์๋๋ฉฐ ๊ฐ ์ค์ฒฉ ํญ๋ชฉ์ ํธ์ถ ์คํ์ ์ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
์ด ์์ ์์ ํจ์ ํธ์ถ์ด ํธ์ถ ์คํ์ ๋ฐฐ์น๋๋ ์์ฒด ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋ค. ์ฐ๋ฆฌ๊ฐ ์์ง ์ดํด๋ณด์ง ์๋ ๊ฒ์ ์ด๋ป๊ฒ ์ง์ญ ๋ณ์๊ฐ ๊ทธ ์์์ ์์ฉํ๋๊ฐ์ด๋ค. ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ์ข ๋ณ๊ฒฝํด์ ํจ์์ ์ง์ญ๋ณ์๋ฅผ ๋ง๋ค์ด๋ณด์.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
์ฌ๊ธฐ์๋ ์ฃผ๋ชฉํ ๋งํ ๋ช ๊ฐ์ง ์ค์ํ ์ธ๋ถ์ ์ด ์๋ค. ์ฒซ ๋ฒ์งธ๋ก ๋๊ฒจ์ฃผ๋ ์ด๋ค ์ธ์์ด๋ ๊ทธ ํจ์์ ์คํ ์ปจํ ์คํธ์ ์ง์ญ ๋ณ์๋ก ์ถ๊ฐ๋๋ค. ์์์์ handle ๋ณ์๋ ์ ์ญ ์คํ ํ๊ฒฝ(ํด๋น ๋ณ์๊ฐ ์ ์๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์)๊ณผ getURL ์คํ ์ปจํ ์คํธ์ ์ธ์๋ก ๋๊ฒจ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ ๊ณณ ๋ชจ๋์ ๋ณ์๋ก์ ์กด์ฌํ๋ค. ๋ค์์ผ๋ก ํจ์ ๋ด๋ถ์์์ ์ธ๋ ๋ณ์๊ฐ ํด๋น ํจ์์ ์คํ ์ปจํ ์คํธ ๋ด์ ์๋ค. twitterURL์ ์์ฑํ ๋ twitterURL์ด getURL ๋ด๋ถ์์ ์ ์๋์๊ธฐ ๋๋ฌธ์ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์๋ getURL์ ์คํ ์ปจํ ์คํธ ๋ด์ ์๋ค. ๋น์ฐํด ๋ณด์ผ ์ ์์ง๋ง ๋ค์ ์ฃผ์ ์ธ ์ค์ฝํ์ ๊ธฐ๋ณธ์ด๋ค.
๊ณผ๊ฑฐ์ "๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณณ"์ด๋ผ๋ ๋ฌธ์ฅ๊ณผ ํจ๊ป "์ค์ฝํ"์ ์ ์์ ๋ํด์ ์๋ง ๋ค์ด๋ณด์์ ๊ฒ์ด๋ค. ๋น์์ ๊ทธ๊ฒ ๋ง์ด ๋๋ ๊ทธ๋ ์ง ์๋ , ์๋ก ์๊ฒ ๋ ์คํ ์ปจํ ์คํธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์๊ฐํ ๋๊ตฌ์ ๋ํ ์ง์๊ณผ ํจ๊ป ์ค์ฝํ์ ๋ํด ๊ทธ ์ด๋ ๋๋ณด๋ค ๋ ๋ช ํํด์ก์ ๊ฒ์ด๋ค. ์ฌ์ค MDN์ "์ค์ฝํ"๋ฅผ "ํ์ฌ ์คํ ์ปจํ ์คํธ"๋ผ๊ณ ์ ์ํ๋ค. ์ต์ํ์ง ์์๊ฐ? ์คํ ์ปจํ ์คํธ์ ๋ํด ์๊ฐํ๋ ๊ฒ๊ณผ ๋งค์ฐ ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก "์ค์ฝํ" ํน์ "๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณณ"์ ๋ํด ์๊ฐํ ์ ์๋ค.
์ฌ๊ธฐ ํ ์คํธ ๋ฌธ์ ๊ฐ ์๋ค. ์๋์ ์ฝ๋๊ฐ ๋ก๊ทธ๋์ด ์ถ๋ ฅ๋ ๋ bar๋ ๋ฌด์์ผ๊น?
function foo () {
var bar = 'Declared in foo'
}
foo()
console.log(bar)
JavaScript Visualizer๋ก ํ์ธํด๋ณด์.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
foo๊ฐ ํธ์ถ๋์์ ๋ ์๋ก์ด ์คํ ์ปจํ ์คํธ๋ฅผ ํธ์ถ ์คํ์ ์์ฑํ์๋ค. ์์ฑ ๋จ๊ณ๋ this, arguments๋ฅผ ์์ฑํ๊ณ bar๋ฅผ undefined๋ก ์ธํ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ๋จ๊ณ๊ฐ ์ผ์ด๋๊ณ bar์ Declared in foo ๋ฌธ์์ด์ด ํ ๋น๋๋ค. ์คํ ๋จ๊ณ๊ฐ ์ข ๋ฃ๋ ํ์ foo ์คํ ์ปจํ ์คํธ๋ ์คํ์์ ์ ๊ฑฐ๋๋ค. foo๊ฐ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋๊ณ , ์ฐ๋ฆฌ๋ bar๋ฅผ ์ฝ์์ฐฝ์ ์ถ๋ ฅํ๋ ค๊ณ ํ๋ค. ๊ทธ ์๊ฐ์ JavaScript Visualizer์ ๋ฐ๋ฅด๋ฉด, bar๋ ๋ง์น ์กด์ฌํ ์ ์ด ์์๋ ๊ฒ ๊ฐ์ด ๋ณด์ฌ ReferenceError: bar is not defined. ๊ฐ ๋ฐ์ํ๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ํจ์ ๋ด๋ถ์์ ์์ฑ๋ ๋ณ์๋ ์ง์ญ ๋ฒ์์ด๋ค. ์ด ์๋ฏธ๋ (๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์, ๋์ค์ ์์ธ์ ๋ํด์ ์ดํด๋ณผ ๊ฒ์ด๋ค.) ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ํธ์ถ ์คํ์ผ๋ก๋ถํฐ ์ ๊ฑฐ๋๊ณ ๋๋ฉด ์ง์ญ ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ ๋ค๋ฅธ ์์ ๊ฐ ์๋ค. ์๋์ ์ฝ๋๊ฐ ์คํ ์ข ๋ฃ๋ ํ ์ฝ์์๋ ๋ฌด์์ด ์ถ๋ ฅ๋ ๊ฒ์ธ๊ฐ?
function first () {
var name = 'Jordyn'
console.log(name)
}
function second () {
var name = 'Jake'
console.log(name)
}
console.log(name)
var name = 'Tyler'
first()
second()
console.log(name)
๋ค์ ํ๋ฒ JavaScript Visualizer์์ ์ดํด๋ณด์.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
undefined, Jordyn, Jake, ๊ทธ๋ฆฌ๊ณ Tyler๊ฐ ์ถ๋ ฅ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๊ฐ ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ๊ทธ๋ค ์์ ๋ง์ ๊ณ ์ ํ ๋ณ์ ํ๊ฒฝ์ ๊ฐ๋ ๊ฒ์ ๋ํด ์๊ฐํด ๋ณผ ์ ์๋ค. ๋ค๋ฅธ ์คํ ์ปจํ ์คํธ์ ๋ณ์ name์ด ํฌํจ๋์ด ์๋๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จผ์ ํด๋น ๋ณ์์ ๋ํ ํ์ฌ ์คํ ์ปจํ ์คํธ๋ฅผ ์ฐพ๋๋ค.
์ด๊ฒ์ผ๋ก ์ง๋ฌธ์ ์๊ธธ ์ ์๋๋ฐ, ๋ง์ผ ํด๋น ๋ณ์๊ฐ ํ์ฌ ์คํ ์ปจํ ์คํธ์ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ด๋ ํ๊ฐ? ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ทธ ๋ณ์ ์ฐพ๊ธฐ๋ฅผ ์ค๋จํ ๊ฒ์ธ๊ฐ? ์ด ์ง๋ฌธ์ ๋ต๋ณ์ด ๋ ์์ ๋ฅผ ์ดํด๋ณด์. ์๋์ ์ฝ๋์์ ๋ฌด์์ด ์ถ๋ ฅ๋ ๊ฒ์ธ๊ฐ?
var name = 'Tyler'
function logName () {
console.log(name)
}
logName()
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
logName์ ์คํ ์ปจํ ์คํธ์์ ํด๋น ์ค์ฝํ ๋ด์ name ๋ณ์๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น์ ์ ์ง๊ฐ์ undefined๋ฅผ ๋ก๊ทธํ๋ค๋ ๊ฒ์ด์์์ง ๋ชจ๋ฅธ๋ค. ๊ทธ๋ ๊ฒ ์๊ฐํ ์๋ ์์ง๋ง ํ๋ ธ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํจ์์ ์คํ ์ปจํ ์คํธ์ ๋ก์ปฌ์ธ ๋ณ์๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ ํด๋น ๋ณ์์ ๋ํด ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ ์คํ ์ปจํ ์คํธ๋ฅผ ์ฐพ๋๋ค. ์ด ํ์ ์ฒด์ธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๋๋ฌํ ๋๊น์ง ๊ณ์ ์ฌ๋ผ๊ฐ๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ง์ผ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ํด๋น ๋ณ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์ฐธ์กฐ ์๋ฌ๋ฅผ ๋์ง ๊ฒ์ด๋ค.
์ง์ญ ์คํ ์ปจํ ์คํธ์ ๋ณ์๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ฐ ๊ฐ๋ณ ๋ถ๋ชจ ์คํ ์ปจํ ์คํธ๋ฅผ ํ๋์ฉ ์ด๋ํ์ฌ ํ์ธํ๋ ๊ณผ์ ์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. JavaScript Visualizer๋ ๊ฐ๊ฐ์ ์๋ก์ด ์คํ ์ปจํ ์คํธ๋ฅผ ๋ค์ฌ ์ฐ๊ธฐ์ ๊ณ ์ ํ ์์์ ๋ฐฐ๊ฒฝ์ ์ฌ์ฉํ์ฌ ์ค์ฝํ ์ฒด์ธ์ ํ์ํ๋ค. ์๊ฐ์ ์ผ๋ก ๋ชจ๋ ์์ ์คํ ์ปจํ ์คํธ๋ ๋ถ๋ชจ ์คํ ์ปจํ ์คํธ์ ์๋ ๋ชจ๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ง๋ง ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
์์์ ํจ์ ๋ด๋ถ์์ ์์ฑ๋ ๋ณ์๋ ์ง์ญ ์ค์ฝํ์ด๋ฉฐ ์ด๋ค์ ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋๋ฉด ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ (๋๋ถ๋ถ์ ๊ฒฝ์ฐ)์ ๋ํด์ ๋ฐฐ์ ๋ค. ์ด์ "๋๋ถ๋ถ์ ๊ฒฝ์ฐ"์ ๋ํด์ ์์๋ณผ ์๊ฐ์ด๋ค. ์ด๊ฒ์ด ์ฌ์ค์ด ์๋ ํ ๊ฐ์ง ์๋๋ฆฌ์ค๋ ํจ์๊ฐ ๋ค๋ฅธ ํจ์ ์์ ์ค์ฒฉ๋ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ์ ์์ ํจ์๋ ๋ถ๋ชจ ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ ํ์๋ ์ฌ์ ํ ์ธ๋ถ์ ํจ์ ์ค์ฝํ์ ์ ๊ทผํ ์ ์๋ค. ๋ง์ด ๊ธธ์๋ค. ๋ ๊ทธ๋ฌ๋ฏ์ด, JavaScript Visualizer๊ฐ ๋์์ค ์ ์๋ค.
์ค์ค๋ก ์ฝ๋ ์๊ฐํํด๋ณด๊ธฐ
makeAdder ์คํ ์ปจํ ์คํธ๊ฐ ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ ํ์ JavaScript Visualizer๊ฐ ํด๋ก์ ์ค์ฝํ๋ผ๋ ๊ฒ์ ์์ฑํ๋ค. ํด๋ก์ ์ค์ฝํ์ ๋ด๋ถ๋ makeAdder ์คํ ์ปจํ ์คํธ์ ์กด์ฌํ๋ ๋์ผํ ๋ณ์ ํ๊ฒฝ์ด๋ค. ์ด๊ฒ์ด ๋ฐ์ํ๋ ์ด์ ๋ ๋ค๋ฅธ ํจ์์ ์ค์ฒฉ๋ ํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ๋ฆฌ์ ์์ ์์ inner ํจ์๋ makeAdder ํจ์ ๋ด์ ์ค์ฒฉ๋์ด ์๋ค. ๊ทธ๋์ inner๋ makeAdder ๋ณ์ ํ๊ฒฝ์ ํด๋ก์ ๋ฅผ ๋ง๋ ๋ค. makeAdder ์คํ ํ๊ฒฝ์ด ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ ํ์๋ ํด๋ก์ ์ค์ฝํ๊ฐ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ inner๋ ๋ณ์ x์ (์ค์ฝํ ์ฒด์ธ์ ํตํด์) ์ ๊ทผํ ์ ์๋ค.
์ด๋ฏธ ์ถ์ธกํ๊ฒ ์ง๋ง, ๋ถ๋ชจ ํจ์์ ๋ณ์ ํ๊ฒฝ์ ๋ํด ์์ ํจ์๊ฐ "๋ซํ๋" ๊ฐ๋ ์ ํด๋ก์ ๋ผ๊ณ ํ๋ค.
Asใ alใ wใ ใ aใ ys, JavaScript Visualizer can help us out here.
Bonus Section
๋ด๊ฐ ์ธ๊ธํ์ง ์์ผ๋ฉด ๋๊ตฐ๊ฐ ๋๋ฅผ ์ฐพ์ ๊ฒ์ ์๊ณ ์๋ ๋ช ๊ฐ์ง ๊ด๋ จ๋ ์ฃผ์ ๋ค์ด ์๋ค.
Global Variables
๋ธ๋ผ์ฐ์ ์์ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๋ณ์๋ฅผ ์์ฑํ๋ฉด (ํจ์ ๋ฐ์), ๊ทธ ๋ณ์๋ window ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ์ถ๊ฐ๋๋ค.
๋ธ๋ผ์ฐ์ ์ Node ๋ชจ๋์์, ์ ์ธ ์์ด ๋ณ์๋ฅผ ์์ฑํ๋ฉด (์, var, let, const), ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ์ถ๊ฐ๋๋ค.
// In the browser
var name = 'Tyler'
function foo () {
bar = 'Created in foo without declaration'
}
foo()
console.log(window.name) // Tyler
console.log(window.bar) // Created in foo without declaration
let and cosnt
let๊ณผ const๋ var๊ณผ๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ํ๋ํ๋ค. "var vs let vs const in JavaScript"์์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ํ์ธํด๋ณด๋ผ.
the this keyword
์ด ์ํฐํด์์ ๋ชจ๋ ์คํ ์ปจํ ์คํธ์ ์์ฑ ๋จ๊ณ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด this๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๊ณ ๋ฐฐ์ ๋ค. ์ ์ด๊ฒ์ด ์ค์ํ๊ณ this ํค์๋๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๋ ๋ฒ์ ๋ํด ๋ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด, WTF is this - Understanding the this keyword, call, apply, and bind in JavaScript๋ฅผ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.