๐Ÿคฏ ์‹ฌํ™”: ์‹คํ–‰์ปจํ…์ŠคํŠธ

2ใ…ฃ2ใ…ฃยท2024๋…„ 4์›” 17์ผ

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
14/14
post-thumbnail

์ด์ „ ํฌ์ŠคํŒ…์—์„œ JS๋Š” ๋Ÿฐํƒ€์ž„์‹œ ์—”์ง„์ด ์Šคํƒ, ํ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค. ์Šคํƒ๊ณผ ํ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ?

JS ์—”์ง„์˜ ์ˆ˜ํ–‰ ๋ฐฉ์‹

์—”์ง„์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŒŒ์ผ์€ main ํ•จ์ˆ˜์ธ ๊ฒฉ.
์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๊ตฌ๋™ ๋ฐฉ์‹์€ ํ•จ์ˆ˜ ๊ตฌ๋™ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜ ๊ตฌ๋™ ๋ฐฉ์‹์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด์ „ ํฌ์ŠคํŒ… ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์„ ๋จผ์ € ์ •๋…ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด stack = ์‹คํ–‰ ์ปจํ…์ŠคํŠธ , heap = ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ธ ์…ˆ์ด๋‹ค.
์—”์ง„ ๋‚ด ํ•จ์ˆ˜๋Š” stack์ด๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์€ ์ผ์ข…์˜ ํ”„๋กœ์„ธ์Šค๋กœ์„œ ,ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณต๊ฐ„์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ผ ํ•œ๋‹ค.
๊ธด ๋ง ํ•„์š”์—†์ด ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

var name = 'zero';
function log() {
  console.log(name);
}

function wrapper() {
  name = 'nero'; 
  log();
}
wrapper(); // name ์ถœ๋ ฅ๊ฐ’ ๋งž์ถฐ๋ณด์„ธ์š”~!

1๏ธโƒฃ Creation(Pre-parsing) Phase

js ํŒŒ์ผ์ด ๋Ÿฐํƒ€์ž„ ๋˜๊ธฐ ์ „ ๋จผ์ € ๋ณ€์ˆ˜,ํ•จ์ˆ˜ ๋“ฑ์ด ์„ ์–ธ, ์ดˆ๊ธฐํ™”์‹œํ‚จ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠน์„ฑ์ƒ ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ชจ๋“  ์‹๋ณ„์ž๋Š” ํ˜ธ์ด์ŠคํŒ…๋˜๋ฏ€๋กœ ์„ ์–ธ ์œ„์น˜๋Š” ๋ฌด๊ด€ํ•˜๋‹ค. ์ด ๊ณผ์ •์—์„œ var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์€ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์Šค์ฝ”ํ”„๊ฐ€ ์ „์—ญ์ด๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ œํ•œ๋œ๋‹ค.

2๏ธโƒฃ Execution Phase

์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ์ดํ›„์—” ํ•จ์ˆ˜ ์‹คํ–‰์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ™•๋ณดํ•˜๊ณ  ์‹คํ–‰์‹œํ‚จ๋‹ค. ์ด ๋•Œ, ์Šคํƒ์—๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Œ“์ด๊ฒŒ ๋˜๋ฉฐ, ๊ฐ ์ปจํ…์ŠคํŠธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.

3๏ธโƒฃ = ๐Ÿ” 2๏ธโƒฃ

ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰(ํ˜ธ์ถœ)๋จ์— ๋”ฐ๋ผ EC๊ฐ€ ์ฝœ์Šคํƒ์— ์Œ“์ด๊ณ  EC ๋‚ด๋ถ€์— ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋Š” Lexical(Static) Scope ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ ์–ธ ๋ฐ ์‹คํ–‰๋œ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ(ํ•ด๋‹น EC๋‚ด์— ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์–ด์„œ ๋ถ€๋ชจ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ์˜ฌ๋ผ๊ฐ€์•ผํ•จ) scope chaining์„ ํ•œ๋‹ค.


์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ "nero"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ’ฌ var์ด ์•„๋‹Œ let, const๋ผ๋ฉด?

let name = 'zero';
function log() {
  console.log(name);
}

function wrapper() {
  name = 'nero'; 
  log();
}
wrapper(); // name ์ถœ๋ ฅ๊ฐ’ ๋งž์ถฐ๋ณด์„ธ์š”~!

๊ณผ์ •์€ ์ข€ ๋‹ค๋ฅด์ง€๋งŒ ์—ญ์‹œ "nero"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

var๊ณผ ๋‹ฌ๋ฆฌ let ์„ ์–ธ์ž ์‚ฌ์šฉ์‹œ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋Š” ๋ณ„๊ฐœ๋กœ ์ผ์–ด๋‚œ๋‹ค. ์ฒ˜์Œ ๋“ฃ๋Š”๋‹ค๋ฉด ์ด์ „ ํฌ์ŠคํŒ… ํ˜ธ์ด์ŠคํŒ… ์„ ์ •๋…ํ•˜๋ผ.

๐Ÿ’ฌ var name="nero"๋ผ๋ฉด?

var name = 'zero';
function log() {
  console.log(name);
}

function wrapper() {
  var name = 'nero'; 
  log();
}
wrapper(); // name ์ถœ๋ ฅ๊ฐ’ ๋งž์ถฐ๋ณด์„ธ์š”~!

  • wrapper ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด wrppaer E.C์—์„œ name์ด nero๋กœ ์„ ์–ธ ๋ฐ ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Global E.C ์—์„œ name์€ zero
  • logํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด Lexical scope๋ฅผ ๋”ฐ๋ผ Global E.C ์˜ name์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— "zero"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ •๋ฆฌ

JS ์—”์ง„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(EC)๋ฅผ ์Šคํƒ์— ์Œ“์•„์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ, ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„๊ฐ€๋ฉฐ, var์™€ let/const๋Š” ์Šค์ฝ”ํ”„ ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.


์ฐธ๊ณ 
โœ”๏ธ ํ•จ์ˆ˜์˜ ๋ฒ”์œ„(scope)

profile
https://sususoo.tistory.com/

0๊ฐœ์˜ ๋Œ“๊ธ€