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

์ด๋…ธ๋ฒ ์ด์…˜์บ ํ”„/์ง€์‹์Œ“๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ(JavaScript)

๐ŸŸจJavaScript


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

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

JavaScript์˜ ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ํŠน์ • ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น (๋ฐ ์žฌํ• ๋‹น) ๊ฐ€๋Šฅํ•จ.

let foo = 42 // foo๊ฐ€ ์ˆซ์ž
foo = 'bar' // foo๊ฐ€ ์ด์ œ ๋ฌธ์ž์—ด
foo = true // foo๊ฐ€ ์ด์ œ ๋ถˆ๋ฆฌ์–ธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐœ์ฒด ๋ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์‚ฌ์–‘์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋А์Šจํ•œ ์œ ํ˜• ๋˜๋Š” ์•ฝํ•œ ์œ ํ˜•. 

์•ฝํ•œ ํ˜•์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ "๋А์Šจํ•œ" ํ˜•์‹ ์ง€์ • ๊ทœ์น™์€ ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

๋™์  ์ธก๋ฉด๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋™์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ์–ธ์–ด๋ผ๊ณ  ํ•จ . ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๋™์ ์ด๋ฉฐ(์œ ํ˜• ๋ฐ ์กด์žฌ ๋ชจ๋‘) ์ฝ”๋“œ๋„ ๋™์ . 

 

2. JavaScript ํ˜•๋ณ€ํ™˜

ํ•จ์ˆ˜์™€ ์—ฐ์‚ฐ์ž์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์€ ๋Œ€๋ถ€๋ถ„ ์ ์ ˆํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ณผ์ •์„ "ํ˜• ๋ณ€ํ™˜(type conversion)"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

alert๊ฐ€ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์˜ ์ž๋ฃŒํ˜•๊ณผ ๊ด€๊ณ„์—†์ด ์ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‚˜, ์ˆ˜ํ•™ ๊ด€๋ จ ์—ฐ์‚ฐ์ž๊ฐ€ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ˜• ๋ณ€ํ™˜์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์ด ์™ธ์—, ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์˜๋„๋ฅผ ๊ฐ–๊ณ  ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜(๋ช…์‹œ์  ๋ณ€ํ™˜)ํ•ด ์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ํ˜• ๋ณ€ํ™˜์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ์ž๋™ ํ˜•๋ณ€ํ™˜ / ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜

 

String() ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ : ๋ฌธ์žํ˜•์˜ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ์ผ์–ด๋‚จ

 

Number() ์ˆซ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜  / ์ˆซ์ž๊ฐ€์•„๋‹์‹œ NaN: ์ˆ˜ํ•™๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜์™€ ํ‘œํ˜„์‹์—์„œ ์ž๋™์œผ๋กœ ์ผ์–ด๋‚จ

์ˆซ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ ์‹œ ์ ์šฉ๋˜๋Š” ๊ทœ์น™

undefined NaN
null 0
true and false 1 ๊ณผ 0
string ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๊ณผ ๋ ๊ณต๋ฐฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ ์ œ๊ฑฐ ํ›„ ๋‚จ์•„์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์—†๋‹ค๋ฉด 0, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์— ์‹คํŒจํ•˜๋ฉด NaN์ด ๋ฉ๋‹ˆ๋‹ค.

Boolean() ๋ถˆ๋ฆฐํ˜•์œผ๋กœ ๋ณ€ํ™˜: ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒ

๋ถˆ๋ฆฐํ˜•์œผ๋กœ์˜ ํ˜• ๋ณ€ํ™˜ ๊ทœ์น™

์ „๋‹ฌ๋ฐ›์€ ๊ฐ’ํ˜• ๋ณ€ํ™˜ ํ›„ ํ˜• ๋ณ€ํ™˜ ํ›„
0, null, undefined, NaN, "" false
๊ทธ ์™ธ์˜ ๊ฐ’ true

์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ

  • ์ˆซ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ ์‹œ undefined๋Š” 0์ด ์•„๋‹ˆ๋ผ NaN์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด "0"๊ณผ " "๊ฐ™์€ ๊ณต๋ฐฑ์€ ๋ถˆ๋ฆฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ ์‹œ true๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

3. ==, ===

== ===
๋™๋“ฑ์—ฐ์‚ฐ์ž ์ผ์น˜์—ฐ์‚ฐ์ž
 ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์ด ์„œ๋กœ ๊ฐ™์œผ๋ฉด ์ฐธ(true)์„ ๋ฐ˜ํ™˜
๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์ด ์„œ๋กœ ๋‹ค๋ฅด๋ฉด, ๋น„๊ต๋ฅผ ์œ„ํ•ด
๊ฐ•์ œ๋กœ ํƒ€์ž…์„ ๊ฐ™๊ฒŒ ๋ณ€ํ™˜
ํƒ€์ž…์˜ ๋ณ€ํ™˜ ์—†์ด ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์ด ๊ฐ™๊ณ , 
ํƒ€์ž…๋„ ๊ฐ™์•„์•ผ๋งŒ ์ฐธ(true)์„ ๋ฐ˜ํ™˜
ํ”ผ์—ฐ์‚ฐ์ž๋“ค์˜ ๊ฐ’๋งŒ ๋น„๊ต
ํ”ผ์—ฐ์‚ฐ์ž๋“ค์˜ ๊ฐ’๊ณผ ํƒ€์ž…์„ ๋ชจ๋‘ ๋น„๊ต
0๊ณผ false๋ฅผ ๊ตฌ๋ณ„X
๋ฐ์ดํ„ฐํƒ€์ž…์˜ ๋™๋“ฑ์—ฌ๋ถ€๊นŒ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜

 

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

๋ฌธ์ œ์ 

- ์‹คํ–‰ ๋„์ค‘์— ๋ณ€์ˆ˜์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํƒ€์ž…์ด ๋“ค์–ด์™€ ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

- ๋™์ ํƒ€์ž… ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ํ™•์ธํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์ง

๋ณด์•ˆ๋ฐฉ๋ฒ•

์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด TypeScipt๋‚˜ Flow ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

5.undefined์™€ null์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋“ค์„ ๋น„๊ตํ•ด๋ณด์„ธ์š”.

null๊ณผ undefined ๋ชจ๋‘ '๊ฐ’์ด ์—†๋‹ค'๋Š” ๊ฐ’์ด์ž, ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋‚˜ํƒ€๋ƒ„
null์€ ๊ฐ’์ด์ง€๋งŒ ๊ฐ’์œผ๋กœ์„œ ์˜๋ฏธ์—†๋Š” ํŠน๋ณ„ํ•œ ๊ฐ’์ด ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ๊ฒƒ, 

undefined๋Š” ๋“ฑ๋ก์ด ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๋„ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ

์ผ์น˜ ์—ฐ์‚ฐ์ž ===๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ต ๋™๋“ฑ ์—ฐ์‚ฐ์ž ==๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ต ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž๋‚˜ ๊ธฐํƒ€ ๋น„๊ต ์—ฐ์‚ฐ์ž <, >, <=, >=๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ต
alert( null === undefined ); // false alert( null == undefined ); // true null๊ณผ undefined๋Š” ์ˆซ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ 
null์€ 0, undefined๋Š” NaN์œผ๋กœ ๋ณ€ํ™˜

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

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

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ
Primitive Type (์›์‹œํƒ€์ž…)
์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ
Reference Type (์ฐธ์กฐ ํƒ€์ž…)
string
๋ฌธ์ž์—ด ํƒ€์ž…
Object ๊ฐ์ฒด



Array  ๋ฐฐ์—ด



Function ํ•จ์ˆ˜

 number
์ˆซ์žํƒ€์ž…
 boolean
๋…ผ๋ฆฌ์  ์ฐธ๊ณผ ๊ฑฐ์ง“
undefined
var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ์•”์ฃฝ์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๊ฐ’
null
๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋„์ ์œผ๋กœ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’
symbol
ES6์—์„œ ์ถ”๊ฐ€๋œ 7๋ฒˆ์งธ ํƒ€์ž…
- ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value)
- ๋ณ€์ˆ˜์— ํ• ๋‹น ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ์ €์žฅ๋˜๊ณ ,
ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์›์‹œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณด๊ด€
- ๋ณ€์ˆ˜ ์„ ์–ธ, ์ดˆ๊ธฐํ™”, ํ• ๋‹น ์‹œ ๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—
์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผ
- ๋ณ€์ˆ˜์— ์ƒˆ ๊ฐ’์ด ํ• ๋‹น ๋  ๋•Œ ๋ณ€์ˆ˜์— ํ• ๋‹น ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์—
์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ”๋กœ ๋ณ€๊ฒฝ
- ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’(mutable value)
- ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜์— ํ• ๋‹น ๋  ๋•Œ ๊ฐ’์ด ์ง์ ‘ ํ•ด๋‹น
๋ณ€์ˆ˜์— ์ €์žฅ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ณ€์ˆ˜์—๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ์ €์žฅ
- ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ €์žฅ๋œ ํž™(heap) ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅ
- ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , 
์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ์—”์ง„์ด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ 
์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ ‘๊ทผ

2.๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

'๋ถˆ๋ณ€ ๊ฐ์ฒด'๋ž€? '๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด' ์ฆ‰ ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€ ์ธ๋ฐ const์™€ Object.freeze()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

const

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜์ธ const์ด๋‹ค. ES6๋ฌธ๋ฒ•๋ถ€ํ„ฐ let๊ณผ const๋ฅผ ์ง€์›ํ•œ๋‹ค.

const ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค, ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์ผ๊นŒ? 

const test = {};
test.name = "mingyo";

console.log(test);  // {"mingyo"}

ES6์—์„œ์˜ const๋Š” ํ• ๋‹น๋œ ๊ฐ’์ด ์ƒ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’์ด ์ƒ์ˆ˜๊ฐ€ ๋˜๋Š”, ์ฆ‰ test๋ณ€์ˆ˜๊ฐ€ ์ƒ์ˆ˜๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ test๋ณ€์ˆ˜์—๋Š” ๊ฐ์ฒด ์žฌํ• ๋‹น์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.

์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ์ด์œ ๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ’(๊ฐ์ฒด) ์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜์ธ test๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๊ณ 

๊ฐ์ฒด์˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ํ•œ ์ด์œ ๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ์€ ๋˜์ง€๋งŒ ( {} -> name : "mingyo" ) ๊ฐ์ฒด์™€ ๋ณ€์ˆ˜(test)์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ์€ ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. 

๋•Œ๋ฌธ์— ๋น„๋ก ์žฌํ• ๋‹น์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•จ์œผ๋กœ ์ธํ•ด ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ๊นŒ์ง€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๊ณ  ํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค. ๋”ฐ๋ผ์„œ Object.freeze()๋ผ๋Š” JS๋‚ด์žฅ๋ฉ”์†Œ๋“œ๋„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

Object.freeze()

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ธ Object.freeze() ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” "๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ" ๋ผ๊ณ  ์ ํ˜€์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?๋จผ์ € ์ด ๋ฉ”์†Œ๋“œ์˜ ์‚ฌ์šฉ๋ฒ•๋ถ€ํ„ฐ ์•Œ์•„๋ณด๋ฉด,

let test = {
    name : 'kim'
}

Object.freeze(test);

์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. test ๋ณ€์ˆ˜์— key value๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ›„ Object.freeze(test)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”์ธ๋”ฉ๋œ ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ๋•Œ๋ฌธ์— test ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

test.name = 'Jung';
console.log(test) // {name: 'kim'}

์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ฌด์‹œ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Object.freeze()๋Š” ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

test = {
    age : 15
};
console.log(test); // {age: 15}

์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋•Œ๋ฌธ์— Object.freeze()๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋Ÿผ ๊ฒฐ๊ตญ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋ƒ๋ฉด..

const์™€ Object.freeze()๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (const์˜ ์žฌํ• ๋‹น๋ถˆ๊ฐ€ + Object.freeze()์˜ ๊ฐ์ฒด์†์„ฑ ๋ณ€๊ฒฝ๋ถˆ๊ฐ€)

๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

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

Object.freeze(test);

๋จผ์ € constํ‚ค์›Œ๋“œ๋กœ ๋ฐ”์ธ๋”ฉ ๋œ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜ํ™” ์‹œํ‚จ ๋‹ค์Œ, Object.freeze()๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด

๊ฐ์ฒด์˜ ์žฌํ• ๋‹น๊ณผ ๊ฐ์ฒด์˜ ์†์„ฑ ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

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

์–•์€ ๋ณต์‚ฌ(Shallow Copy) ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)
์–•์€ ๋ณต์‚ฌ๋ž€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ธฐ์กด ๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋ผ๋„ ๊ธฐ์กด ๋ณ€์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•œ๋‹ค. ๊นŠ์€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ ์›๋ณธ๊ณผ์˜ ์ฐธ์กฐ๊ฐ€ ์™„์ „ํžˆ ๋Š์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ชฉ์ ์€ ๊ธฐ์กด ๊ฐ์ฒด์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๊ฐ€์ ธ์™€ ๋ณ„๋„๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด ๋Œ€๋ถ€๋ถ„์ด๋‹ค. ๊ธฐ์กด ๊ฐ์ฒด๊นŒ์ง€ ๊ฑด๋“œ๋ฆฐ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ชฉ์ ์— ๋ฒ—์–ด๋‚œ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด๋งŒ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋ณต์‚ฌ๋œ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์›๋ณธ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์›๋ณธ ๊ฐ์ฒด ๋ฐ ๋ณต์‚ฌ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ๊ฐ’์€ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌ ํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊นŒ์ง€ ๋ณต์‚ฌํ•œ๋‹ค.
  • ์ „๋ถ€๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ์ฃผ์†Œ์— ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฉค๋ฒ„๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ ์ฐธ์กฐ๊ฐ’์˜ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐ๋œ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์›๋ณธ์˜ ์ฐธ์กฐ๋Š” ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 


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

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

์Šค์ฝ”ํ”„(Scope)
์Šค์ฝ”ํ”„๋ž€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (Execution Context)์—์„œ ๋ณด๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž๋ฅผ ๋งํ•œ๋‹ค.
  • ์ „์—ญ ์Šค์ฝ”ํ”„ - ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ๋ฐ”๊นฅ์— ์„ ์–ธ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณ€์ˆ˜๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„์— ํฌํ•จ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ - ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋˜๋ฉด ์ด ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
ํ˜ธ์ด์ŠคํŒ… (hoisting)
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์‹คํ–‰์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ์˜ ์ค‘๊ฐ„์— ์„ ์–ธํ•˜๋”๋ผ๋„ ๋งจ ์•ž์— ์„ ์–ธํ•œ ๊ฒƒ๊ณผ ๊ฐ™์•„์ง€๋ฉฐ, ์ด๋ฅผ ๋ณ€์ˆ˜ ๋Œ์–ด์˜ฌ๋ฆผ, ํ˜ธ์ด์ŠคํŒ… (hoisting) ์ด๋ผํ•œ๋‹ค.
ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ์˜ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋‹ค.

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค.

2. ์ „์—ญ ์ปจํ…์ŠคํŠธ์— ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ฒŒ ๋œ๋‹ค.
3. ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ์ฝ”๋“œ์˜ ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
3. ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์— ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.
TDZ(Temporal Dead Zone)
TDZ ๋ž€ Temporal Dead Zone ์˜ ์•ฝ์ž๋กœ ์šฐ๋ฆฌ ๋ง๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€๋ผ๋Š” ์˜๋ฏธ์ด๋ฉฐ, ์Šค์ฝ”ํ”„ ์‹œ์ž‘ ~ ์ดˆ๊ธฐํ™” ์‹œ์ž‘ ์‚ฌ์ด์˜ ๊ตฌ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ ์ „๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์ด๋‹ค.

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

ํ•จ์ˆ˜ ์„ ์–ธ์‹(function declartion) ํ•จ์ˆ˜ ํ‘œํ˜„์‹(function Expression)
ํ•จ์ˆ˜๋ช…์ด ์ •์˜๋˜์–ด ์žˆ๊ณ , ๋ณ„๋„์˜ ํ• ๋‹น ๋ช…๋ น์ด ์—†๋Š” ๊ฒƒ ์ •์˜ํ•œ function์„ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ
ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…
 
์ •์˜๋œ ๋ฒ”์œ„์˜ ๋งจ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…๋˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ ์ „์—
ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ
๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹น
๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด ํ˜ธ์ด์ŠคํŒ…
์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…

3.let, const, var, function ์ด ์–ด๋–ค ์›๋ฆฌ๋กœ ์‹คํ–‰๋˜๋Š”์ง€

var const let  function
ํ•œ๋ฒˆ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Œ
์„ ์–ธํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
1. ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„
2. ํ• ๋‹น ๋‹จ๊ณ„
function scope
1.์„ ์–ธ + ์ดˆ๊ธฐํ™” + ํ• ๋‹น


 
Block scope
Immutable
1. ์„ ์–ธ
2.์ดˆ๊ธฐํ™”
3.ํ• ๋‹น

Block scope
Mutable
์„ ์–ธ๋ฌธ ํ‘œํ˜„์‹œ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ
์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ

 

  ์žฌ์„ ์–ธ ์žฌํ• ๋‹น
var O O
let X O
const X X

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ(execution context) ์ฝœ ์Šคํƒ(call stack)
์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ƒ์„ฑ๋˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ
1. Global Execution context
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•ŒGlobal
Execution Context๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ƒ์„ฑ ๊ณผ์ •์—์„œ ์ „์—ญ
๊ฐ์ฒด์ธ Window Object (Node๋Š” Global) ๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
this๊ฐ€ Window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
2. Function Execution context
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ ๋œ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ Execution Context๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ž์‹ ๋งŒ์˜ Execution Context๋ฅผ ๊ฐ€์ง„๋‹ค.
์—”์ง„์ด ์ฒ˜์Œ script๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, Global Execution Context๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Call Stack์— pushํ•œ๋‹ค. ๊ทธ ํ›„ ์—”์ง„์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ Execution Context๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Call Stack์— push ํ•œ๋‹ค.

4.

์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chain)

  • JavaScript ์—”์ง„์€ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋‚˜ ์ ‘๊ทผ์„ฑ์„ ์ฐพ์•„๋‚ด๊ณ  ๊ทธ ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ฝ”ํ”„ ์ฒด์ธ(Scope Chain)์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋ฒ”์œ„ ์ฒด์ธ์ด๋ž€ ํ•œ ๋ณ€์ˆ˜์— ๋ฒ”์œ„(๊ธ€๋กœ๋ฒŒ ๋˜๋Š” ๋กœ์ปฌ/ํ•จ์ˆ˜ ๋˜๋Š” ๋ธ”๋ก ๋ฒ”์œ„์ผ ์ˆ˜ ์žˆ์Œ)๊ฐ€ ์žˆ๊ณ  ๋‹ค๋ฅธ ๋ฒ”์œ„(๊ธ€๋กœ๋ฒŒ ๋˜๋Š” ๋กœ์ปฌ/ํ•จ์ˆ˜ ๋˜๋Š” ๋ธ”๋ก ๋ฒ”์œ„์ผ ์ˆ˜ ์žˆ์Œ)๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋จ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด ์™„์ „ํ•œ ์ฒด์ธ ํ˜•์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๊ณ„์†๋˜๊ณ , ์ค‘์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ  ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์€๋‹‰ํ™”(variable shadowing)

ํŠน์ • ๋ฒ”์œ„(๊ฒฐ์ • ๋ธ”๋ก, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค) ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ์™ธ๋ถ€ ๋ฒ”์œ„์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์งˆ ๋•Œ ๋ฐœ์ƒ 

let๋ธ”๋ก ๋ฒ”์œ„ ์ง€์ • ๊ณผ ํ•จ๊ป˜ ECMAScript6 ๋„์ž…์œผ๋กœ const๊ฐ€๋ณ€ ์„€๋„์ž‰์ด ๊ฐ€๋Šฅํ•จ.

function myFunc() {
    let my_var = 'test';
    if (true) {
        let my_var = 'new test';
        console.log(my_var); // new test
    }
    console.log(my_var); // test
}
myFunc();

๐Ÿ”ป์‹ค์Šต ๊ณผ์ œ

  • ์ฝ˜์†”์— ์ฐํž b ๊ฐ’์„ ์˜ˆ์ƒํ•ด๋ณด๊ณ , ์–ด๋””์—์„œ ์„ ์–ธ๋œ “b”๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ผ์ธ์—์„œ ํ˜ธ์ถœํ•œ console.log์— ์ฐํ˜”๋Š”์ง€, ์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. ์ฃผ์„์„ ํ’€์–ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b);// a=1,b=101; }
// b๋Š” ์ „์—ญ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์—์ž์‹ ์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„์™€ ํ•˜์œ„ ์ง€์—ญ ์Šค์ฝ”ํ”„์—์„œ๋งŒ
์œ ํšจํ•œ ์ง€์—ญ ์Šค์ฝ”ํ”„์ธ b๊ฐ€ ์•„๋‹Œ ์ „์—ญ ์Šค์ฝ”ํ”„๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

//console.log(a); a=undifend
console.log(b); // b=1;
hi();
console.log(b); //b=1;

//let์™€ const๋Š” ์ง€์—ญ ๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค ํ•จ์ˆ˜ ๋ฐ–์—์„œ a๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์ „์—ญ์— ๋‘ฌ์•ผํ•œ๋‹ค.

๐Ÿ”ป์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ ์ž๋ฃŒ

https://devuna.tistory.com/82

https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures

https://ko.javascript.info/type-conversions

https://yorr.tistory.com/21

https://intrepidgeeks.com/tutorial/javascript-light-copy-and-deep-copy

https://tutorialpost.apptilus.com/code/posts/js/js19-scope/

https://funveloper.tistory.com/25

https://medium.com/sjk5766/call-stack%EA%B3%BC-execution-context-%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-3c877072db79

https://en.wikipedia.org/wiki/Variable_shadowing