ํ•ญํ•ด99/ํ•ญํ•ด99 storage

React ๊ณผ์ œ

crab. 2022. 7. 21. 20:25

๐Ÿค JavaScript์˜ ์ž๋ฃŒํ˜•๊ณผ JavaScript๋งŒ์˜ ํŠน์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ ?

๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด

  • JavaScript๋Š” ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
  • JavaScript์˜ ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ํŠน์ • ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น (๋ฐ ์žฌํ• ๋‹น) ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
let foo = 42 // foo๊ฐ€ ์ˆซ์ž
foo = 'bar' // foo๊ฐ€ ์ด์ œ ๋ฌธ์ž์—ด
foo = true // foo๊ฐ€ ์ด์ œ ๋ถˆ๋ฆฌ์–ธ

JavaScript ํ˜•๋ณ€ํ™˜

var x = "999";    //๋ฌธ์žํ˜• 999

var y = "99.99";    //๋ฌธ์žํ˜• 99.99

var a = parseInt(x);    //์ˆซ์žํ˜• ์ •์ˆ˜ 999

var b = parseInt(y);    //์ˆซ์žํ˜• ์ •์ˆ˜ 99

var a = parseFloat(x);    //์ˆซ์žํ˜• ์‹ค์ˆ˜ 999

var b = parseFloat(y);    //์ˆซ์žํ˜• ์‹ค์ˆ˜ 99.99

var a = Number(x);    //์ˆซ์žํ˜• ์ •์ˆ˜ 999

var b = Number(y);    //์ˆซ์žํ˜• ์‹ค์ˆ˜ 99.99

var x = "a999";    //๋ฌธ์žํ˜• a999

var y = "a99.99";    //๋ฌธ์žํ˜• a99.99

var a = parseInt(x);    //์ˆซ์žํ˜• NaN

var b = ParseInt(y);    //์ˆซ์žํ˜• NaN

var a = parseFloat(x);    //์ˆซ์žํ˜• NaN

var b = parseFloat(y);    //์ˆซ์žํ˜• NaN

var a = Number(x);    //์ˆซ์žํ˜• NaN

var b = Number(y);    //์ˆซ์žํ˜• NaN

โ€ป ๋ฌธ์ž์—ด ๋งจ์•ž์— ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ํ˜•๋ณ€ํ™˜์„ ํ•ด๋„ ๊ฐ’์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

var x = "999a9";    //๋ฌธ์ž์—ด 999a9

var y = "99.9a9";    //๋ฌธ์ž์—ด 99.9a9

var a = parseInt(x);    //์ˆซ์žํ˜• 999

var b = parseInt(y);    //์ˆซ์žํ˜• 99

var a = parseFloat(x);    //์ˆซ์žํ˜• 999

var b = parseFloat(y);    //์ˆซ์žํ˜• 99.9

var a = Number(x);    //์ˆซ์žํ˜• NaN

var b = Number(y);    //์ˆซ์žํ˜• NaN

  • ์ˆซ์žํ˜•์„ ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

var ๋ณ€์ˆ˜ = String(์ˆซ์ž);    //์ˆซ์ž๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์คŒ

var ๋ณ€์ˆ˜ = ์ˆซ์ž.toString(์ง„๋ฒ•);    //์ˆซ์ž๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์คŒ - ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ์ง„๋ฒ•์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ

var ๋ณ€์ˆ˜ = ์ˆซ์ž.toFixed(์†Œ์ˆ˜์ž๋ฆฌ์ˆ˜);    //์ˆซ์ž๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์คŒ - ์‹ค์ˆ˜ํ˜•์˜ ์†Œ์ˆ˜์  ์ž๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

var ๋ณ€์ˆ˜ = ์ˆซ์ž + "๋ฌธ์ž์—ด";    //์ˆซ์ž์™€ ๋ฌธ์ž์—ด์„ ํ•œ ๋ฌธ์ž์—ด๋กœ ๋”ํ•ด์คŒ

var x = 123;    //์ˆซ์žํ˜• 123

var a = String(x);    //๋ฌธ์žํ˜• 123

var a = x.toString();    //๋ฌธ์žํ˜• 123

var a = x.toString(2);    //๋ฌธ์žํ˜• 1111011(2์ง„๋ฒ•)

var a = x.toString(16);    //๋ฌธ์žํ˜• 7b(16์ง„๋ฒ•)

var a = x.toFixed();    //๋ฌธ์žํ˜• 123

var a = x.toFixed(1);    //๋ฌธ์žํ˜• 123.0

var y = 99.999;    //์ˆซ์žํ˜• 99.999

var a = x.toFixed();    //๋ฌธ์žํ˜• 99

var a = x.toFixed(1);    //๋ฌธ์žํ˜• 99.9

var a = x.toFixed(3);    //๋ฌธ์žํ˜• 99.999

var a = x.toFixed(4);    //๋ฌธ์žํ˜• 99.9990

==, ===

==๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

254 == '254'                // return true
true == 1                   // return true
undefined ==null           // return true
'abc' ==newString('abc')  // return true
null ==false               // return false
'true' ==true              // return false
true == 2                   // return false

===๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

254 === '254'               // return false
true === 1                  // return false
undefined ===null          // return false
'abc' ===newString('abc') // return false

๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ด๊ณ  ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.

  • ์‹คํ–‰ ๋„์ค‘์— ๋ณ€์ˆ˜์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํƒ€์ž…์ด ๋“ค์–ด์™€ ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ๋™์ ํƒ€์ž… ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ํ™•์ธํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์ง‘๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด TypeScipt๋‚˜ Flow ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

undefined์™€ null์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์„ธ์š”

  • undefined์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ์ƒํƒœ,
  • null์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋นˆ ๊ฐ’์„ ํ• ๋‹นํ•œ ์ƒํƒœ(๋นˆ ๊ฐ์ฒด)์ด๋‹ค.
  • ์ฆ‰, undefined๋Š” ์ž๋ฃŒํ˜•์ด ์—†๋Š” ์ƒํƒœ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ typeof๋ฅผ ํ†ตํ•ด ์ž๋ฃŒํ˜•์„ ํ™•์ธํ•ด๋ณด๋ฉด null์€ object๋กœ, undefined๋Š” undefined๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค JavaScript ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ์ด๋ž€ ?

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

  • ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ์ €์žฅ๋˜๋ฉฐ ์›์‹œ ๋ฐ์ดํ„ฐ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋ฏ€๋กœ,
  • ๋ถˆ๋ณ€์ ์ด๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.(์žฌ์‚ฌ์šฉ)
  • ์ฐธ์กฐ ํƒ€์ž…์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ• ๋•Œ ๊ฐ’์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • Object
  • Array
  • const ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— Array.push๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฐฐ์—ด์€ ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • Function RegExp
  • ๋ฌธ์ž์—ด์— ๋‚˜ํƒ€๋‚˜๋Š” ํŠน์ • ๋ฌธ์ž์กฐํ•ฉ๊ณผ ๋Œ€์‘์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ด๋‹ค.
  • Map
  • else..
  • ์ฐธ์กฐํ˜•์€ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’์ด ์ง€์ •๋œ ์ฃผ์†Œ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

JavaScript ํ˜•๋ณ€ํ™˜

const test = {
    'name' : 'jung'
};

Object.freeze(test);
  • ๋จผ์ € constํ‚ค์›Œ๋“œ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚จ ๋‹ค์Œ,
  • Object.freeze()๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด
  • ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น๊ณผ ๊ฐ์ฒด์˜ ์†์„ฑ ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

  • ์–•์€ ๋ณต์‚ฌ Shllow Copy
  • ์–•์€ ๋ณต์‚ฌ๋ž€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ์œ„์˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์›๋ž˜๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๊ฐ์ฒด์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•œ๊ฐœ์˜ ๊ฐ์ฒด๋ผ๋„ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•œ๋‹ค.
  1. Object.assign()
  2. ์ „๊ฐœ์—ฐ์‚ฐ์ž
  • ๊นŠ์€ ๋ณต์‚ฌ Deep Copy
  • ๊นŠ์€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ ์›๋ณธ๊ณผ์˜ ์ฐธ์กฐ๊ฐ€ ์™„์ „ํžˆ ๋Š์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
  1. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ณต์‚ฌ
  2. JSON.stringify()
  3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

๐Ÿค ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?

์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ…, TDZ

์Šค์ฝ”ํ”„


  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค.
  • ๊ฐ™์€ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ์— ์กด์žฌํ•˜๋ฉด ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑด๋ฐ
  • ES6์—์„œ let ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

ํ˜ธ์ด์ŠคํŒ…


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

TDZ(Temporal Dead Zone, ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€)


  • TDZ์˜ ์˜ํ•ญ์„ ๋ฐ›๋Š” ๊ตฌ๋ฌธ const, let, class
  • ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„์˜ ๋งจ ์œ„์—์„œ๋ถ€ํ„ฐ ~ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ ์‹œ์ ๊นŒ์ง€์˜ ๋ณ€์ˆ˜๋Š” TDZ์— ๋“ค์–ด๊ฐ„ ๋ณ€์ˆ˜

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์ฐจ์ด

  • ํ•จ์ˆ˜ ์„ ์–ธ์‹ (function declartion)

ํ•จ์ˆ˜๋ช…์ด ์ •์˜๋˜์–ด ์žˆ๊ณ , ๋ณ„๋„์˜ ํ• ๋‹น ๋ช…๋ น์ด ์—†๋Š” ๊ฒƒ

function sum(a,b) {
    return a + b;
}
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹ (function Expression)

์ •์˜ํ•œ function์„ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ

const sum = function(a,b) {
    return a + b;
}
  • ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ… ํ•ฉ๋‹ˆ๋‹ค. ์ •์˜๋œ ๋ฒ”์œ„์˜ ๋งจ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…๋˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ ์ „์— ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด ํ˜ธ์ด์ŠคํŒ… ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ

Execution Context

  • Execution Context ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์œผ๋กœ, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์ด๋‹ค.
  • ๋” ์ž์„ธํžˆ ๋งํ•˜์ž๋ฉด, ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์  ์–ธ์–ด๋กœ์„œ์˜ ์„ฑ๊ฒฉ์„ ๊ฐ€์žฅ ์ž˜ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋….
  • ๋ชจ๋“  ์ฝ”๋“œ๋Š” ํŠน์ •ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ์‹คํ–‰๋œ๋‹ค.
  • javascript๋Š” ์–ด๋–ค execution context๊ฐ€ ํ™œ์„ฑํ™”๋˜๋Š” ์‹œ์ ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์„ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ (hoisting), ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , this๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

callstack

  • call์€ ํ˜ธ์ถœ์„ ๋œปํ•œ๋‹ค.stack์€ ์ถœ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ๊นŠ์€ ์šฐ๋ฌผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋‹ค.
  • ๋”ฐ๋ผ์„œ callstack์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์šฐ๋ฌผ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.
  • ํ•ญ์ƒ ๋งจ ์œ„์— ๋†“์ธ ํ•จ์ˆ˜๋ฅผ ์šฐ์„ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” context์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธ, ๋ณ€์ˆ˜ ์€๋‹‰ํ™”

  • ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์— ์˜ํ•ด ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง. ⇒ ์™ธ๋ถ€ ํ•จ์ˆ˜(outer function) / ์ค‘์ฒฉ ํ•จ์ˆ˜(nested function)
  • ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฝ”๋“œ์˜ ์Šค์ฝ”ํ”„์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•จ.
  • ์—ฌ๋Ÿฌ ์Šค์ฝ”ํ”„์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์Šค์ฝ”ํ”„ ์ฒด์ธ ์ƒ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๊ฒ€์ƒ‰๋œ ์‹๋ณ„์ž์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ ⇒ ๋ณ€์ˆ˜ ์€๋‹‰ํ™”(variable shadowing)
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ outerEnvironmentReference์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง.

๐Ÿ’ก ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ '๋‹จ๋ฐฉํ–ฅ'์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

๐Ÿค ์‹ค์Šต ๊ณผ์ œ

 

์ฝ˜์†”์— ์ฐํž b ๊ฐ’์„ ์˜ˆ์ƒํ•ด๋ณด๊ณ , ์–ด๋””์—์„œ ์„ ์–ธ๋œ “b”๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ผ์ธ์—์„œ ํ˜ธ์ถœํ•œ console.log์— ์ฐํ˜”๋Š”์ง€, ์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. ์ฃผ์„์„ ํ’€์–ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.

let b = 1;

function hi () {

const a = 1;

let b = 100;

b++;

console.log(a,b);

}

//console.log(a);

console.log(b);

hi();

console.log(b);
  • ์ œ์ผ ๋จผ์ € 15๋ฒˆ์งธ ๋ผ์ธ์—์„œ 1 ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
    • ์™œ๋ƒ๋ฉด function์—์„œ ์ •์˜๋œ b๋Š” ๊ทธ ๋‚ด๋ถ€์—์„œ๋งŒ ์ •์˜๋˜์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๊ณ 
    • 15๋ฒˆ์งธ๋ผ์ธ์—์„œ๋Š” ์•„์ง ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ 17๋ฒˆ์งธ ๋ผ์ธ์—์„œ hi() ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด 10๋ฒˆ์งธ ๋ผ์ธ์„ ํ†ตํ•ด 1 101 ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
    • ์™œ๋ƒ๋ฉด ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์ธ์ž๋Š” ์—†๊ณ ,
    • ํ•จ์ˆ˜๋‚ด๋ถ€์—์„œ ์ƒˆ๋กญ๊ฒŒ a, b๊ฐ’์ด ํ• ๋‹น ๋˜์—ˆ์œผ๋ฉฐ
    • b++์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ 19๋ฒˆ์งธ ๋ผ์ธ์—์„œ 1์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
    • hi ํ•จ์ˆ˜์—์„œ b++์„ ํ•ด๋„ ๊ทธ ์ฆ๊ฐ€๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋œ ๊ฒƒ์ด๊ธฐ์—
    • ํ•จ์ˆ˜๋ฐ–์—๋Š” ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ 1 ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์„์„ ํ’€๋ฉด Uncaught ReferenceError: a is not defined ๊ฐ€ ๋œน๋‹ˆ๋‹ค.
    • ์™œ๋ƒ๋ฉด a๋Š” hiํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ •์˜๋œ ์ƒ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.