๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

[๋‚ด๋ณด๋‚ด๋ฒˆ] Javascript - The Ultimate Guide to Hoisting, Scopes, and Closures in JavaScript

2021.04.06 - [JavaScript] - [๋‚ด๋ณด๋‚ด๋ฒˆ] Javascript: What Is The Execution Context? What Is The Call Stack? 

 

[๋‚ด๋ณด๋‚ด๋ฒˆ] Javascript: What Is The Execution Context? What Is The Call Stack?

์–ผ๋งˆ ์ „ GitHub์— ์žˆ๋Š” 33 Concepts Every JavaScript Developer Should Know ๋ผ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ชจ๋‘ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…๋“ค์ธ๋ฐ ๋ชจ๋ฅด๋Š” ๊ฒƒ๋„ ๋งŽ๊ณ , ์„ค๋ช…ํ•ด๋ณด๋ผ๊ณ  ํ•ด๋„ ๋ชปํ•  ๋‚ด์šฉ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ

birdmee.tistory.com

 

์œ„์˜ ๊ธ€์— ์„œ๋‘์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ, GitHub์— ์žˆ๋Š” 33 Concepts Every JavaScript Developer Should Know ๋ผ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋‚ด์šฉ ์ค‘ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ์•„ํ‹ฐํด์„ ๋‚ด๊ฐ€ ์ •๋ฆฌํ•  ๊ฒธ ๊ธฐ์–ตํ•  ๊ฒธ ์ž‘์„ฑํ•˜๋Š” ๋ฒˆ์—ญ๊ธ€์ด๋‹ค. 33๊ฐ€์ง€ ์ค‘ ์ฒซ ๋ฒˆ์งธ์ธ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด๋‹ค.

โ€ป ๋‚ด๋ณด๋‚ด๋ฒˆ(๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ๋‚ด๊ฐ€ ๋ฒˆ์—ญํ•œ): ์˜์–ด ์ „๊ณต์ž๋„ ํ•ด์™ธ ์œ ํ•™ํŒŒ๋„ ์•„๋‹ˆ๊ธฐ์— ๋ฒˆ์—ญ์—๋Š” ์˜์—ญ, ์˜ค์—ญ, ๊ตฌ๊ธ€ ๋ฒˆ์—ญ์ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜คํƒ€๋„ ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ ์›๋ฌธ์„ ์ง์ ‘ ์‚ดํŽด๋ณด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ •๋ณด๋“ค์„ ๋” ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
(ํ•˜์ง€๋งŒ ๋Œ“๊ธ€ ํ”ผ๋“œ๋ฐฑ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜ƒ )

์ด๋ฒˆ์— ๊ณ ๋ฅธ ์•„ํ‹ฐํด์€ Tyler McGinnis ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  The Ultimate Guide to Hoisting, Scopes, and Closures in JavaScript ์ด๋‹ค.

 

The Ultimate Guide to Hoisting, Scopes, and Closures in JavaScript - ui.dev

In this post you'll learn about JavaScript's Execution Context. Along the way, you'll learn other advanced topics like hoisting, the scope chain, and closures.

ui.dev


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

์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•œ ๊ฐ€์ง€ ์ „๋žต์€ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ๋œ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ "์กฐ๊ฐ๋“ค"์€ ๋งŽ์€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ (ํ•จ์ˆ˜, ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€ ๋“ฑ) ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ํ•œ ๊ฐ€์ง€ ๋ชฉ์ ์„ ์œ„ํ•ด์„œ ์กด์žฌํ•œ๋‹ค - ์šฐ๋ฆฌ ๋ถ„๋ฆฌํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ด์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ผ. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐฉ๋ฒ•์ธ ์กฐ๊ฐ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์„ํ•˜๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋Ÿฌํ•œ "์กฐ๊ฐ๋“ค"์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•จ์ˆ˜/๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ด, ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ ํ•ด์„ ๋ฐ ์‹คํ–‰์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ชฉ์ ์— ๋Œ€ํ•ด ์•Œ์•˜๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ์— ๋Œ€๋‹ตํ•ด์•ผ ํ•  ์งˆ๋ฌธ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ๋ฌด์—‡์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ƒ๋Š” ๊ฒƒ์ด๋‹ค. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” "์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Global Execution Context)"์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ „์—ญ ๊ฐ์ฒด์™€ this๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ณ€์ˆ˜ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ „์—ญ ๊ฐ์ฒด๋Š” window๊ฐ€, Node ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” global์ด ๋  ๊ฒƒ์ด๋‹ค. 

์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” ์ฝ”๋“œ ํ•œ ์ค„ ์—†์ด๋„ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—ฌ์ „ํžˆ window์™€ this ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ์ „์—ญ ์‹คํ–‰ ์ปจํƒ์ŠคํŠธ์ด๋‹ค. 

ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€์„œ ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์— ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž. ๋ช‡ ๊ฐ€์ง€ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณด์ž.

์œ„์˜ ๋‘ ์ด๋ฏธ์ง€์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์ฑ˜๋Š”๊ฐ€? ํ•ต์‹ฌ์€ ๊ฐ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์ฆ‰ ์ƒ์„ฑ(Creation) ๋‹จ๊ณ„์™€ ์‹คํ–‰(Execution) ๋‹จ๊ณ„์ด๊ณ  ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ๊ณ ์œ ํ•œ ์ฑ…์ž„์ด ์žˆ๋‹ค. 

์ „์—ญ ์ƒ์„ฑ(Global Creation) ๋‹จ๊ณ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ 

  1. ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  2. "this"๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  3. ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ค์ •
  4. ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋™์•ˆ ๋ณ€์ˆ˜ ์„ ์–ธ์— ๊ธฐ๋ณธ๊ฐ’ "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๊ฐ€ ํ• ๋‹น๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ๊ณ , "ํ˜ธ์ด์ŠคํŒ…"์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ–ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๊ทธ๊ฒŒ ์ „๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 


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

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

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•˜๋Š” ์ฃผ๋œ ์งˆ๋ฌธ์€ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ข€ ์ „์— ์ „์—ญ ์ƒ์„ฑ ๋‹จ๊ณ„ ๋ถ€๋ถ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€

  1. ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  2. "this"๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  3. ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ค์ •
  4. ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋™์•ˆ ๋ณ€์ˆ˜ ์„ ์–ธ์— ๊ธฐ๋ณธ๊ฐ’ "undefined"๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•  ๋•Œ ์œ„์˜ ๋‹จ๊ณ„๋“ค ์ค‘ ์–ด๋Š ๋‹จ๊ณ„๊ฐ€ ๋ง์ด ์•ˆ ๋ ๊นŒ? ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด๋‹ค. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  JavaScript ์—”์ง„์ด ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ƒ์„ฑ ๋‹จ๊ณ„ ์ค‘์— ๋งŒ๋“ค์–ด์ง„ ์ „์—ญ ๊ฐ์ฒด ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ์— ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ธ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ดํ•œ๋‹ค. ์ด ์ ์„ ์—ผ๋‘์— ๋‘๊ณ , ์šฐ๋ฆฌ๋Š” ์ด์ „๋ถ€ํ„ฐ ์šฐ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (?) ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ 

  1. ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  2. "this"๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  3. ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ค์ •
  4. ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋™์•ˆ ๋ณ€์ˆ˜ ์„ ์–ธ์— ๊ธฐ๋ณธ๊ฐ’ "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๋ฅผ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.