๋ฆฌ์•กํŠธ(React)

๋ฆฌ์•กํŠธ์•ˆ์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

changy0ng 2022. 7. 21. 14:12

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

 

๐Ÿ“Œ JavaScript๋Š” ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์ž…๋‹ˆ๋‹ค.  

Javascript๋ณ€์ˆ˜๋Š” ๋งŒ๋“ค์—ˆ์„๋•Œ ๋ฐ”๋กœ ํŠน์ • ํƒ€์ž… ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉฐ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ• ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๋˜ํ•œ ์žฌํ• ๋‹น ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ํžˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” untyped ๋˜๋Š” weakly-typed์–ธ์–ด๋ผ๊ณ ๋„ ๋งŽ์ด ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด "12345" ๋ผ๋Š” ๋ฌธ์ž์—ด๊ณผ 1์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๊ฒŒ ๋˜๋ฉด ์›๋ž˜๋Š” ๋ฌธ์ž์—ด์— int๋ผ๋Š” type์„ ์ž๋ฐ”์—์„œ๋Š” ์„ค์ •ํ•ด์ฃผ๊ฒ ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ทธ๋ƒฅ "12345 * 1 === ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ’์€ 12345๋กœ ์ˆซ์ž๋กœ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” weakly-typed๋ผ๊ณ  ๋ณผ์ˆ˜ ์žˆ์ง€์š”. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” String a = "blah"; ๋˜๋Š” var a:String = 'blah' ์ด๋Ÿฐ์‹์œผ๋กœ ํƒ€์ž…์„ ์ค„ ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด๋ž˜์„œ untyped ์–ธ์–ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. 

 

๋™์ (dynamic)์–ธ์–ด๋ผ๋Š” ๊ฒƒ์€ 

x = 12345;    // number
x = "string"; // string
x = { key: "value" }; // object

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

 

๐Ÿ“Œ JavaScript ํ˜•๋ณ€ํ™˜ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋งค์šฐ ์œ ์—ฐํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋•Œ๋กœ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ•„์š”์—ฌ๋ถ€์— ๋”ฐ๋ผ '์•”์‹œ์ ๋ณ€ํ™˜' ๋˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์˜๋„์— ๋”ฐ๋ผ '๋ช…์‹œ์ ๋ณ€ํ™˜'์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ ์•”์‹œ์ ๋ณ€ํ™˜

์•”์‹œ์ ๋ณ€ํ™˜์ด๋ž€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜์‹œํ‚ค๋Š”๊ฒƒ

ex)

์‚ฐ์ˆ ์—ฐ์‚ฐ์ž : ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž(+)๋Š” ์ˆซ์ž๋ณด๋‹ค ๋ฌธ์ž์—ด์ด ์šฐ์„ ์‹œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์žํ˜•์ด ๋ฌธ์žํ˜•์„ ๋งŒ๋‚˜๋ฉด ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

number + number // number
number + string // string
string + string // string
string + boolean // string
number + boolean // number

๊ทธ ์™ธ ์—ฐ์‚ฐ์ž: (-, *, /, %)๋Š” ์ˆซ์žํ˜•์ด ๋ฌธ์žํ˜•๋ณด๋‹ค ์šฐ์„ ์‹œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ๋ฌธ์žํ˜• ๋ณ€ํ™˜์ด ์ผ์–ด๋‚˜์ง€์•Š๋Š”๋‹ค.

string * number // number
string * string // number
number * number // number
string * boolean //number
number * boolean //number

 

๐ŸŸฅ ๋ช…์‹œ์ ๋ณ€ํ™˜

๋ช…์‹œ์ ๋ณ€ํ™˜์ด๋ž€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜์‹œํ‚ค๋Š”๊ฒƒ

 

ex)

ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ 'Object(), String(), Boolean(), Number()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๊ธดํ•˜๋Š”๋ฐ new ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์„๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜๋Š” ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ์จ ์‚ฌ์šฉ๋œ๋‹ค.

 

์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์„ ์ˆซ์žํƒ€์ž…์œผ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Number()

2. parseInt()

3. parseFloat()

4. +()

 

์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์„ ๋ฌธ์žํƒ€์ž…์œผ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. String()

2. .toString()

3. .toFixed() -> ์ธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์ธ์ž๊ฐ’๋งŒํผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์†Œ์ˆ˜์ ์„ ํ‘œํ˜„ํ•˜๋ฉฐ ์†Œ์ˆ˜์ ์„ ๋„˜์น˜๋Š” ๊ฐ’์ด ์ธ์ž๋กœ ๋“ค์–ด์˜ฌ๋•Œ '0'์œผ๋กœ ๊ธธ์ด๋ฅผ ๋งž์ถ˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜

 

์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์„ ๋ถˆ๋ฆฐ(Boolean)ํƒ€์ž…์œผ๋กœ ๋ณ€ํ˜•ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. Boolean()

 

๐Ÿ“Œ '=='์™€ '==='์˜ ์ฐจ์ด์  

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์—„๊ฒฉํ•œ ๋น„๊ต์™€ ์œ ํ˜•๋ณ€ํ™˜ ๋น„๊ต๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์—ฐ์‚ฐ์ž๊ฐ€ ์–ด๋–ค ๋น„๊ต์กฐ๊ฑด์— ์‚ฌ์šฉ๋˜๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ==๋Š” ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ํ˜•์„ ์ˆ˜์ •ํ•˜๋Š”๋ฐ์— ๋น„ํ•ด ===๋Š” ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

 

๋‘ ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์ด ์ผ์น˜ํ•  ๊ฒฝ์šฐ true๋ฅผ returnํ•˜๋ฉฐ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ returnํ•œ๋‹ค.

 

๐Ÿ’ญ'==' ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋‘ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋น„๊ต

-> ํŠนํžˆ ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์ด ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ถ€ ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜ ํ›„์— ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. 

ํƒ€์ž…์„ ๋ฐ”๋กœ ๋น„๊ตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ===์—ฐ์‚ฐ์ž์— ๋น„ํ•ด ๋Š์Šจํ•˜๋‹ค.

ex)

10 == '10' // ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ต
true == 1 // ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ 1๋กœ ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ต
true == '1' // ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ 1๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด 1 == '1'์ด ๋˜์ง€๋งŒ ๋ฌธ์ž์—ด '1'์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ํ›„ ๊ฐ’์„ ๋น„๊ต true๋ฅผ ๋ฐ˜ํ™˜
true == 'true' // 1 == 'true'๊ฐ€ ๋˜์ง€๋งŒ ๋ฌธ์ž์—ด 'true'๋Š” ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ธฐ์— 1=='true'๋กœ ๋˜์–ด false๋ฅผ return
null ==  undefined // null๊ณผ undefined๋Š” ๋‹ค๋ฅด์ง€๋งŒ ==์—์„œ๋Š” true๋ฅผ ๋ฐ˜ํ™˜

 

๐Ÿ’ญ'==='๋Š” ์—„๊ฒฉํ•œ ๋น„๊ต๋ฅผ ํ•œ๋‹ค, ํŠนํžˆ ๊ฐ’์ด๋ž‘ ์ž๋ฃŒํ˜•์ด true์ผ๋•Œ

-> ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํƒ€์ž…์ด ์„ธํŒ…๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜. NaN์€ ์ž๊ธฐ ์ž์‹ ์„ ํฌํ•จํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฐ’๊ณผ๋„ ์ผ์น˜ ํ•˜์ง€ ์•Š์Œ. ์ฆ‰ NaN์ด ์กด์žฌํ• ๊ฒฝ์šฐ ํ•ญ์ƒ false๋ฅผ returnํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

-> ์ •ํ™•ํ•œ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ• ๋•Œ์—๋Š” localeCompare ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ์™œ๋ƒํ•˜๋ฉด ๋ฌธ์ž์—ด์ด ๋ˆˆ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ๊ณผ๋‹ฌ๋ฆฌ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ex)

10 === 10   // true

10 === '10' // false

true === 1  // false

true === 'true' // false

null === undefined // false

NaN === NaN // false

๐Ÿ“Œ ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ๊ณผ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ? 

 

๐Ÿ’ญ Javascript๋Š” ๋ณ€์ˆ˜ ์ƒ์„ฑ ์‹œ ์›์‹œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์žฅ์ ์€ ์žˆ์ง€๋งŒ ๋งŽ์€ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ์™€ API๊ฐ€ ์˜ค๊ณ ๊ฐ€๋Š” ๋Œ€ํ˜•ํ”„๋กœ์ ํŠธ ๋˜๋Š” ํ˜‘์—… ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰์‹œ์— ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ๊นŒ๋‹ค๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌํ–ˆ์„๋•Œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ฌธ์ œ๋ฅผ ์ง๋ฉดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „๋‹ฌํ•œ ๋ช…์„ธ์„œ 
{ 
id: number,
product_name: string, 
price: number
}

// ํ”„๋ŸฐํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ
{ 
id: 12345,
product_name: 'water melon', 
price: '12,000'
}

์ด ์˜ˆ์‹œ์—์„œ ๋ณด๋“ฏ์ด id๊ฐ€ ์ˆซ์ž๋กœ ์˜ค๊ณ  product_name์€ ๋ฌธ์ž์—ด๋กœ ์˜ค๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๊ดœ์ฐฎ์œผ๋‚˜ price๋Š” ์ˆซ์ž๋กœ ์™€์•ผํ•˜๋Š”๋ฐ ํ”„๋ŸฐํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ณด๋‚ด๋“ฏ์ด type error๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ญ์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ •์ ํƒ€์ž… ์ฒดํฌ์™€ ๊ฐ•๋ ฅํ•œ ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•œ Typescript๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ Typescript๋Š” Javascript์— ํƒ€์ž…์„ ๋ถ€์—ฌํ•œ ์ •์  ํƒ€์ž… ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Typescript๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์‹œ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ํŠธ๋žœ์Šค ํŒŒ์ผ ๊ณผ์ •(์ผ์ข…์˜ ์ปดํŒŒ์ผ ๊ณผ์ •)์„ ๊ฑฐ์น˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ํŠธ๋žœ์Šค ํŒŒ์ผ ๊ณผ์ •์ด๋ž€ ์ž‘์„ฑ๋œ ์†Œ์Šค์ฝ”๋“œ์™€ ๋น„์Šทํ•œ ์ˆ˜์ค€์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š”๊ฒŒ ํฐ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Typescript๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋ฉด Javascript๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ๋Š” ์ปดํŒŒ์ผ ๋œ๋‹ค๊ณ  ๋˜‘๊ฐ™์ด ํ‘œํ˜„์„ ํ•ฉ๋‹ˆ๋‹ค. 

 

๐ŸŸฅ Typescript ๊ฐ™์€ ์ •์  ํƒ€์ž… ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„ ์ „์— ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹œํ–‰ํ•˜๊ฒŒ ๋˜๋ฉฐ ๋™์ ํƒ€์ž… ์–ธ์–ด๋Š” ๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋žจ์˜ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค ์ฆ‰ ์„  ์ฒ˜๋ฆฌ ํ›„ ์‹คํ–‰๊ณผ ์„  ์‹คํ–‰ ํ›„ ์ฒ˜๋ฆฌ๋ผ๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ž˜ํผ๋Ÿฐ์Šค ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ• ์‹œ Typescript๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ˜๋ฉด์— Javascript๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

 

๐Ÿ“Œ undefined์™€ null์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด 

 

๐Ÿ’ญ undefined๋Š” ๋ณ€์ˆ˜์ค‘์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์–ด๋–ค ๊ฒƒ์œผ๋กœ๋„ ์„ค๋ช…๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ญ null์€ ๋ณ€์ˆ˜์ค‘์— ์„ค๋ช…์€ ๋˜์ง€๋งŒ ๊ฐ’์ด ๋น ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

 

ex)์˜ˆ์‹œ

let a;
console.log(a); // undefined

let b = null;
console.log(b); // null

๋ณ€์ˆ˜๊ฐ€ undefined์ผ์ง€ null์ผ์ง€ ๊ตฌ๋ณ„ํ• ๋•Œ๋Š” == ๋˜๋Š” ===๋ฅผ ์“ธ์ˆ˜ ์žˆ๋Š”๋ฐ == ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋Š์Šจํ•˜๊ฒŒ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— undefined์™€ null์„ ๋˜‘๊ฐ™์ด true๋กœ ๋ฆฌํ„ดํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„๊ตํ•ด์ค„๋•Œ

//a = undefined variable

let a;
if (a == null) {
  console.log('Null or undefined value!');
} else {
  console.log(a);
}

์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ์— ํ‘œ๊ธฐ๋ฅผ ํ•ด์ค„์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค null์ด๋‚˜ undefined์ผ๋•Œ true๋ฅผ ๋ฆฌํ„ดํ•ด์ค˜ ํ• ๋•Œ

ํ•˜์ง€๋งŒ ===๋ฅผ ์“ด๋‹ค๋ฉด ์„œ๋กœ null๊ณผ undefined์—์„œ type์„ ๋ฐ”๋กœ ๋น„๊ตํ•ด์ฃผ๋Š”๋ฐ ์„œ๋กœ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ๋ฆฌํ„ดํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ๊ฐ์ด null์ธ์ง€ undefined์ธ์ง€ ํ‘œ๊ธฐ๋ฅผ ๊ตฌ๋ถ„์ง€์–ด์ค˜์„œ ์“ธ๋•Œ ์ข‹์Šต๋‹ˆ๋‹ค.

let a;

if (a === null) {
  console.log('Null Value!');
} else if (a === undefined) {
  console.log('Undefined Value!');
}

 

 

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

 

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

 

๐Ÿ’ญ๊ธฐ๋ณธํ˜•๋ฐ์ดํ„ฐ ํƒ€์ž…(Primitive Type)

๊ธฐ๋ณธํ˜• ํƒ€์ž…์˜ ์ข…๋ฅ˜์—๋Š” ์ˆซ์ž(Number), ๋ฌธ์ž์—ด(String), ๋ถˆ๋ฆฌ์–ธ(Boolean), null, undefined, ์‹ฌ๋ณผ(Symbol) ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

* Symbol ๊ฐ™์€๊ฒฝ์šฐ๋Š” ES6์— ์ถ”๊ฐ€, ๊ฐ์ฒด ์†์„ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค

 

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ์ €์žฅ์ด ๋˜๊ณ  ์›์‹œ๋ฐ์ดํ„ฐ ๊ทธ ๊ฐ’ ๊ทธ ์ž์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๋ฏ€๋กœ ๋ถˆ๋ณ€์ ์ธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.  

๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

 

์›๋ฆฌ๋Š” ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ 

var a;
var b = 'abc';
var c = b;

//์ƒˆ๋กœ ํ• ๋‹นํ•˜๋ ค๋Š” ๋ถ€๋ถ„
a = 10;
b = false;
๋ณ€์ˆ˜๋ช… a b c d
์ฃผ์†Œ @1 @2 @3 ...
์ฃผ์†Œ 1 2 3 ...
๋ฐ์ดํ„ฐ 10 false false ...

๋ณ€์ˆ˜ a๋Š” 1๋ฒˆ ์˜์—ญ, b๋Š” 2๋ฒˆ ์˜์—ญ, c๋Š” 3๋ฒˆ์˜์—ญ์— ํ•ด๋‹น์ฃผ์†Œ๋ฅผ ํ™•๋ณดํ•˜๊ณ  ํ•ด๋‹น์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜๋ช…๊ณผ ๋งตํ•‘์„ ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ธฐ์กด๋ณ€์ˆ˜๋ช…์„ ์ƒˆ๋กœ ํ• ๋‹นํ•˜๊ฒŒ ๋ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋Š” ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๋ถˆ๋ฆฌ์–ธ๊ฐ’์„ ํ†ตํ•ด ๊ธฐ์กด ๋ณ€์ˆ˜์— ๋Œ€์ž…๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

var c = 20; ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด 3์˜ ์œ„์น˜์— ๋ฐ์ดํ„ฐ false ๋ถ€๋ถ„์ด 20์œผ๋กœ ๋ณ€๊ฒฝ์ด๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ญ ์ฐธ์กฐํ˜•๋ฐ์ดํ„ฐ ํƒ€์ž…(Reference Type)

์ฐธ์กฐํ˜•๋ฐ์ดํ„ฐ ํƒ€์ž…์—๋Š” ๊ฐ์ฒด(Object), ๋ฐฐ์—ด(Array), ํ•จ์ˆ˜(Function), ์ •๊ทœํ‘œํ˜„์‹(RegExp), Map, WeakMap, Set, WeakSet ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.   

 

๐Ÿ“Œ ๋ถˆ๋ณ€ ๊ฐ์ฒด(Immutable Object)๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 

 

๐Ÿ’ญ ์ƒํƒœ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑ ํ›„์—๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ์˜๋ฏธ

๐Ÿ’ญ ๋ถˆ๋ณ€๊ฐ์ฒด๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ

๐Ÿ’ญ Multi Threading ํ™˜๊ฒฝ์—์„œ Thread Safety๋ฅผ ๋ณด์žฅ ๋ฐ ์ƒ์ˆ˜๋กœ์„œ Cache ์‚ฌ์šฉํ•˜๊ธฐ๋„ ์šฉ์ด

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ถˆ๋ณ€๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

1. const

2. Object.freeze()

๐ŸŸฅ const

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

 

๊ทธ๋Ÿฐ๋ฐ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด์ธ๊ฐ€?

์˜ˆ๋ฅผ๋“ค์–ด 

const exam = {};
exam.name = "yong";

console.log(exam); // {"yong"}

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

 

๊ฐ์ฒด ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ 

๋ณ€์ˆ˜์˜ ๊ฐ’ ์ฆ‰ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๋ฐ”์ธ๋”ฉ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜์ธ exam ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅ

 

๊ฐ์ฒด์˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ์ด์œ 

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

 

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

 

๐ŸŸฅ Object.freeze()

๊ธฐ๋ณธ์ œ๊ณต ๋ฉ”์†Œ๋“œ์ด๋ฉฐ "๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ"์ด๋‹ค

let food = {
  name : "kimchi"
}

Object.freeze(food);

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ food ๋ณ€์ˆ˜์— key value๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•œ ํ›„ ๋ฐ‘์— freeze๋ฅผ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ”์ธ๋”ฉ๋œ ๋ณ€์ˆ˜๋ฅผ ๋™๊ฒฐ ๊ฐ์ฒด๋กœ ๋งŒ๋“  ์ƒํ™ฉ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ food์˜ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

food.name = 'kimchi';
console.log(food)// {name: 'kimchi'}

์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์†์„ฑ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋„๋Š” ๋ฌด์‹œ๊ฐ€ ๋˜๋Š” ํ˜„์ƒ์ด ์ผ์–ด๋‚œ๋‹ค.

 

But! ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค

food = {
price : 2000
};
console.log(food);

์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์™„๋ฒฝํ•œ ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋ผ๊ณ  ๋ณด๊ธฐ๋Š” ํž˜๋“ค๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ตญ ๋ถˆ๋ณ€๊ฐ์ฒด๋Š”

const์™€ Object.freeze() ์กฐํ•ฉ์œผ๋กœ ๋งŒ๋“ค์ˆ˜์žˆ๋‹ค.

const food = {
  name : 'kimchi'
};

Object.freeze(food)

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

 

๐Ÿ“Œ ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ 

๐Ÿ’ญ ์–•์€ ๋ณต์‚ฌ(Shallow Copy)๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’(์ฃผ์†Œ ๊ฐ’)์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๊นŠ์€ ๋ณต์‚ฌ(Deep Copy)๋Š” ๊ฐ์ฒด์˜ ์‹ค์ œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์›์‹œ๊ฐ’, ์ฐธ์กฐ๊ฐ’ ์ด ๋‘๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ๊ฐ’์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ ์›์‹œ๊ฐ’

ํ•ด๋‹น ๊ฐ’์€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(๋‹จ์ˆœ ๋ฐ์ดํ„ฐ)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Number, String, Boolean, null, undefined, ๋“ฑ์ด ์ด ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ์›์‹œ๊ฐ’์„ ์ €์žฅํ•  ์‹œ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ ์‹œ ์ €์žฅ๋œ ์‹ค์ œ ๊ฐ’์ด ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ ์ฐธ์กฐ๊ฐ’

ํ•ด๋‹น ๊ฐ’์€ ์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Object, symbol, array๋“ฑ์ด ์ด ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์‹œ ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋˜๊ณ  ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฐธ์กฐ(์ฆ‰ ์œ„์น˜ ๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ• ๋•Œ ์‚ฌ์‹ค ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฐธ์กฐ(์œ„์น˜ ๊ฐ’)๋ฅผ ์กฐ์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์›์‹œ๊ฐ’์„ ๋ณต์‚ฌํ•  ๋•Œ ๊ทธ ๊ฐ’์ด ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ  ๊ฐ’์„ ์ˆ˜์ •ํ•ด๋„ ๊ธฐ์กด์˜ ์›์‹œ๊ฐ’์„ ์ €์žฅํ•œ ๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๋“ฏ์ด ์‹ค์ œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๊นŠ์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค

ex)

const a = 7;
let b = a;
b = 1

console.log(a); //7
console.log(b); //1

์ฐธ์กฐ๊ฐ’์„ ๋ณต์‚ฌํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์–ด์„œ ๋ณต์‚ฌ๋œ ๋ณ€์ˆ˜ ๋˜ํ•œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ํ–ฅํ•ด ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ ๋ฐ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ • ์‹œ ๋‘ ๋ณ€์ˆ˜๋Š” ๋˜‘๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ์— ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’(์œ„์น˜ ๊ฐ’)์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

const a = {
  number : 1
}
let b = a;
b.number = 5

console.log(a); // {number : 5}
console.log(b); // {number : 5}

 

์–•์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•
"์–•์€ ๋ณต์‚ฌ๋ž€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ธฐ์กด ๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋ผ๋„ ๊ธฐ์กด ๋ณ€์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค"

 

๐ŸŸฅ Array.prototype.slice()

ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ start๋ถ€ํ„ฐ end ์ธ๋ฑ์Šค๊นŒ์ง€ ๊ธฐ์กด ๋ฐฐ์—ด์—์„œ ์ถ”์ถœ์„ ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ. start๋ถ€ํ„ฐ end ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •์•ˆํ•  ์‹œ ๊ธฐ์กด๋ฐฐ์—ด์„ ์ „์ฒด ์–•์€ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

const origin = ['a', 2, true, 4, "hi"];
const copy = origin.slice();

console.log(JSON.stringify(origin) === JSON.stringify(copy)); // true
copy.push(10);

console.log(JSON.stringify(origin) === JSON.stringify(copy)); // false

console.log(origin); // ['a', 2, true, 4, "hi"];
console.log(copy); // ['a', 2, true, 4, "hi", 10];

์—ฌ๊ธฐ์—์„œ๋Š” array์˜ type์ด๋ผ ๊ธฐ์กด๋ฐฐ์—ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์€ ๋ณต์‚ฌ๋กœ ๋ณด์ผ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์›์‹œ๊ฐ’์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊นŠ์€ ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ array๋Š” ์›์‹œ๊ฐ’์„ ์ €์žฅํ•œ 1์ฐจ์› ๋ฐฐ์—ด์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

const original = [  
  [1, 1, 1, 1],  
  [0, 0, 0, 0],  
  [2, 2, 2, 2],  
  [3, 3, 3, 3],
];

const copy = original.slice(); 

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true 

// ๋ณต์‚ฌ๋œ ๋ฐฐ์—ด์—๋งŒ ๋ณ€๊ฒฝ๊ณผ ์ถ”๊ฐ€.
copy[0][0] = 99; 
copy[2].push(98); 

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true 

console.log(original);
// [ [ 99, 1, 1, 1 ], [ 0, 0, 0, 0 ], [ 2, 2, 2, 2, 98 ], [ 3, 3, 3, 3 ] ]

console.log(copy);
// [ [ 99, 1, 1, 1 ], [ 0, 0, 0, 0 ], [ 2, 2, 2, 2, 98 ], [ 3, 3, 3, 3 ] ]

 ์ด๋ ‡๊ฒŒ 1์ฐจ์› ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ ์ค‘์ฒฉ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ 2์ฐจ์›๋ฐฐ์—ด์—๋Š” ์–•์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

 

๐ŸŸฅ Object.assign()

์ด ๋ฉ”์†Œ๋“œ๋Š” Object.assign(์ƒ์„ฑํ•  ๊ฐ์ฒด, ๋ณต์‚ฌํ•  ๊ฐ์ฒด)

์ฆ‰ ์ฒ˜์Œ์—๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž์— ๋นˆ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋ณต์‚ฌํ•  ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },
}; 

const copy = Object.assign({}, object); 

copy.number.one = 3; 

console.log(object === copy); // false
console.log(object.number.one  === copy.number.one); // true

Object.assign()์€ ์†์„ฑ์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถœ์ฒ˜ ๊ฐ’์ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฒฝ์šฐ, ์ฐธ์กฐ ๊ฐ’๋งŒ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ  Spread์—ฐ์‚ฐ์ž (์ „๊ฐœ์—ฐ์‚ฐ์ž)

 

const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },
}; 

const copy = {...object} 

copy.number.one = 3; 

console.log(object === copy); // false
console.log(object.number.one  === copy.number.one); // true

 

๊นŠ์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•
"๊นŠ์€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ ์›๋ณธ๊ณผ์˜ ์ฐธ์กฐ๊ฐ€ ์™„์ „ํžˆ ๋Š์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค."

๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ชฉ์  ์ž์ฒด๋Š” ๊ธฐ์กด ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๊ฐ€์ ธ์™€ ๋ณ„๋„๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด ๋Œ€๋ถ€๋ถ„์ธ๋ฐ ๊ธฐ์กด ๊ฐ์ฒด๊นŒ์ง€ ๊ฑด๋“œ๋ฆฐ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ชฉ์ ์— ๋ฒ—์–ด๋‚˜๊ธฐ์— ๊นŠ์€๋ณต์‚ฌ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ JSON.parse && JSON.stringify

JSON.stringify()๋Š” ๊ฐ์ฒด๋ฅผ json ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ด ๊ณผ์ •์—์„œ ์›๋ณธ ๊ฐ์ฒด์™€์˜ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ๋Š์–ด์ง€๋Š” ํ˜•ํƒœ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ json ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ํ›„ JSON.parse()๋ฅผ ์ด์šฉํ•ด ๋‹ค์‹œ ์›๋ž˜์˜ ๊ฐ์ฒด ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. 

์ด ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ๊ณผ ๊ฐ์ฒด๊ฐ€ function์ผ ๊ฒฝ์šฐ undefined๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

const copy = JSON.parse(JSON.stringify(object)); 

copy.number.one = 3;
copy.arr[2].push(5); 

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

 

๐ŸŸฅ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ณต์‚ฌ

ํ•˜์ง€๋งŒ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

function deepCopy(object) {  
  if (object === null || typeof object !== "object") {    
    return object;  
  }  // ๊ฐ์ฒด์ธ์ง€ ๋ฐฐ์—ด์ธ์ง€ ํŒ๋‹จ  
  const copy = Array.isArray(object) ? [] : {};   

  for (let key of Object.keys(object)) {    
    copy[key] = deepCopy(object[key]);  
  }   

  return copy;
} 

const copy = deepCopy(object); 

copy.number.one = 3;
copy.arr[2].push(5); 

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

๐ŸŸฅ Lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์šฉ

const deepCopy = require("lodash.clonedeep") 

const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

const copy = deepCopy(object); 

copy.number.one = 3;
copy.arr[2].push(5); 

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

๋งˆ์ง€๋ง‰์œผ๋กœ Lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ์žฅ์ ์ด ์žˆ๋Š”๋ฐ ์„ค์น˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฌธ์ œ์™€ ๊ฐœ๋ฐœ์—๋Š” ํšจ์œจ์ ์ด์ง€๋งŒ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋“ฑ์—๋Š” module์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ํฐ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

 

๐ŸŽ ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

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

๐ŸŸฅ ์Šค์ฝ”ํ”„

๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜

function foo() {
  var x;
}

์—ฌ๊ธฐ์—์„œ x์˜ ์Šค์ฝ”ํ”„๋Š” foo() ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ญ ์–ดํœ˜์  ์Šค์ฝ”ํ”„

์ •์  ์Šค์ฝ”ํ”„(Static scope), ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(Lexical scope)๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์†Œ์Šค ์ฝ”๋“œ์— ์กด์žฌํ•˜๋Š”๋Œ€๋กœ ํ•ด์„ํ•œ ์Šค์ฝ”ํ”„์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ญ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„

์–ดํœ˜์ (์ •์ )์œผ๋กœ ์ง€์ •๋˜๋ฉฐ, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์  ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ๋“ฑ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ํ•จ์ˆ˜๋งŒ์ด ์ƒˆ ์Šค์ฝ”ํ”„๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ญ ์ค‘์ฒฉ ์Šค์ฝ”ํ”„

์Šค์ฝ”ํ”„๊ฐ€ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„ ์•ˆ์— ์ค‘์ฒฉ๋˜์–ด ์žˆ์œผ๋ฉด ๊ทธ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ์Šค์ฝ”ํ”„ ์ „์ฒด์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function foo(arg){
  function bar(){ //์ค‘์ฒฉ ์Šค์ฝ”ํ”„ bar()
    console.log(`Hi, ${arg}`);
  }
  bar();
}

foo("jacob"); //Hi, jacob

๐Ÿ’ญ Shadowing

๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด, ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์™€ ๊ทธ ์•ˆ์— ์ค‘์ฒฉ๋œ ๋ชจ๋“  ์Šค์ฝ”ํ”„๋Š” ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์˜ ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉฐ, ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด ๋‹ค์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var x = "global";
function f(){
  var x = "local";
  console.log(x);  // local
}
f(); // local
console.log(x); // global

๐ŸŸฅ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” ์„ ์–ธ๋“ค์„ ๋ชจ๋‘ ๋Œ์–ด ์˜ฌ๋ ค์„œ ํ•ด๋‹น ํ•จ์ˆ˜ ์œ ํšจ ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์— ์„ ์–ธ ํ•˜๋Š” ๊ฒƒ.
(var ์„ ์–ธ๋ฌธ์ด๋‚˜ function ์„ ์–ธ๋ฌธ ๋“ฑ์„ ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ์˜ฎ๊ธด ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ)

 

ํ˜ธ์ด์ŠคํŒ… ํ•ด์•ผํ•  ๋Œ€์ƒ

var ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์—์„œ๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.
var ๋ณ€์ˆ˜/ํ•จ์ˆ˜์˜ ์„ ์–ธ๋งŒ ์œ„๋กœ ๋Œ์–ด ์˜ฌ๋ ค์ง€๋ฉฐ, ํ• ๋‹น์€ ๋Œ์–ด ์˜ฌ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
let/const ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒ x

 

๐Ÿ’ฅ var , let , const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ๋ถ€๋ถ„๋งŒ ๋Œ์–ด์˜ฌ๋ ค์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ var ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์ „์—๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ• ๋‹น์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ์— undefined์ž…๋‹ˆ๋‹ค.

 

let ๋˜๋Š” const๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ 

๐Ÿ’ฅ ์‹๋ณ„์ž๊ฐ€ ํ˜ธ์ด์ŠคํŒ… ํ›„ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์„ ์–ธ๋˜๊ธฐ ์ „๊นŒ์ง€ TDZ(Temporal Dead Zone/์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€)์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— let, const ์„ ์–ธ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ณณ ์ด์ „์—๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ Temporal Dead Zone(TDZ)

์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ตฌ๊ฐ„์ธ ์Šค์ฝ”ํ”„ ์‹œ์ž‘์ง€์ ๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™” ์ง€์ ๊นŒ์ง€์˜ ๊ตฌ๊ฐ„.
์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” TDZ๋ผ๋Š” ๊ณณ์— ๋จธ๋ฌผ๋Ÿฌ์„œ ์ดˆ๊ธฐํ™”(ํ˜น์€ ํ• ๋‹น)์ด ๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ '์ฃฝ์–ด์žˆ๋Š” ์ƒํƒœ'์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ ์ „์— ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ. ์„ ์–ธ ์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋น„ํ—ˆ์šฉํ•˜๋Š” ๊ฐœ๋…์ƒ์˜ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

 

console.log(a); // undefined
f1(); // undefined
console.log(f2) // undefined
f2(); // TypeError: f2 is not a function
function f1(){
  console.log(b);
  var b = 5;
}
var f2 = function () {
  console.log(c);
  var c = 7;
}
var a = 10;

์ง€์—ญ๋ณ€์ˆ˜ : {}์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ฆ‰ ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ

์ „์—ญ๋ณ€์ˆ˜ : {}๋ฐ–์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ฆ‰ ์–ด๋””๋“ ์ง€ ์“ฐ์ผ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜

 

ํ˜ธ์ด์ŠคํŒ… ์‹œ function ์•ˆ์—์„œ ์“ด ๊ฒƒ ๋นผ๊ณ ๋Š” ์ „๋ถ€ ์ „์—ญ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ฅ const , let ๋ง๊ณ ๋„ class ๊ตฌ๋ฌธ๊ณผ ํด๋ž˜์Šค์˜ constructor() ๋‚ด๋ถ€์˜ super(), ๊ธฐ๋ณธ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ TDZ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด var , function ๊ตฌ๋ฌธ์€ TDZ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ ์Šค์ฝ”ํ”„์—์„œ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฉ๋‹ˆ๋‹ค.

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

๐ŸŸฅ ํ•จ์ˆ˜ ์„ ์–ธ์‹(function declaration)

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

function sum(a,b) {
  return a + b;
}

๐ŸŸฅ ํ•จ์ˆ˜ ํ‘œํ˜„์‹(function expression)

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

const sum = function(a,b) {
  return a +b;
}

์ฃผ์š” ์ฐจ์ด์ ์ด ํ˜ธ์ด์ŠคํŒ… ์‹œ์— ๋ฐœ์ƒํ•˜๊ฒŒ๋˜๋Š”๋ฐ 

๐Ÿ’ฅ ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ… ํ•ฉ๋‹ˆ๋‹ค. ์ •์˜๋œ ๋ฒ”์œ„์˜ ๋งจ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…๋˜์„œ ํ•จ์ˆ˜ ์„ ์–ธ ์ „์— ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ฅ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด ํ˜ธ์ด์ŠคํŒ… ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

sum(50, 50); // 100
minus(100, 50) // Uncaught TypeError: minus is not a function

function sum(a, b) { // ํ•จ์ˆ˜ ์„ ์–ธ์‹
  return a + b;
}

var minus = function (a,b) { // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  return a - b;
}

๐Ÿ’ฅ ํ•จ์ˆ˜ ์„ ์–ธ์‹  => ์ •์ƒ์ ์œผ๋กœ ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅ

 

ํ˜ธ์ด์ŠคํŒ…์„ ๋งˆ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด

function sum(a, b) { // ํ•จ์ˆ˜ ์„ ์–ธ์‹ - ํ•จ์ˆ˜ ์ „์ฒด ํ˜ธ์ด์ŠคํŒ…
  return a + b;
};

var minus; // ํ•จ์ˆ˜ํ‘œํ˜„์‹ - ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…

sum(50, 50); // 100
minus(100, 50) // Uncaught TypeError: minus is not a function

function (a,b) { // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ - ํ• ๋‹น๋ถ€๋Š” ๊ทธ๋Œ€๋กœ
  return a - b;
}

์•„๋ž˜์™€ ๊ฐ™์ด, ์˜ค๋ฅ˜๋‚˜๋Š” ๋ถ€๋ถ„, ์ฆ‰ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„ ์œ„์— ์ž‘์„ฑํ•˜๋ฉด ์—๋Ÿฌ์—†์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

var minus = function (a,b) { // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  return a - b;
}

sum(50, 50); // 100
minus(100, 50) // 50

function sum(a, b) { // ํ•จ์ˆ˜ ์„ ์–ธ์‹
  return a + b;
};

๐Ÿ’ฅ ํ•จ์ˆ˜ ์„ ์–ธ์‹์œผ๋กœ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์ „์ฒด๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๋Š”๋ฐ ์ „์—ญ์ ์œผ๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋  ์‹œ ์ค‘๋ณต์ ์œผ๋กœ ๋™๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋ ์‹œ ์ด๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œlet, const, var, function ์˜ ์‹คํ–‰์›๋ฆฌ 

๐Ÿ’ญ let๋ณ€์ˆ˜์™€ const ๋ณ€์ˆ˜๋Š” ES6 ์ดํ›„ ์ŠคํŽ™์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋“ฑ์žฅํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ๋ฐฐํฌ์šฉ ์ฝ”๋“œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์•„์ง๋„ var ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  var, let, const 3๊ฐ€์ง€๋ฅผ ๊ตฌ๋ถ„ ์ง“๋Š” ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€

1. ๊ฐ’ ๋ณ€๊ฒฝ ์—ฌ๋ถ€

2. ์Šค์ฝ”ํ”„ ๋ฒ”์œ„

3. ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ ์—ฌ๋ถ€

์ด๋ฉฐ ์šฐ์„ ์ˆœ์œ„์— ์žˆ์–ด์„œ๋Š” const, let, var ์ˆœ์ž…๋‹ˆ๋‹ค.

 

 

๐ŸŸฅ ๊ฐ’ ๋ณ€๊ฒฝ ์—ฌ๋ถ€

var์™€ let์„ ๊ฐ’์ด ์„ ์–ธ๋œ ์ดํ›„์—๋„ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, const๋Š” ์ƒ์„ฑํ•  ๋•Œ ์„ ์–ธ๋œ ์ดˆ๊ธฐ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

๐ŸŸฅ ์Šค์ฝ”ํ”„ ๋ฒ”์œ„

var์€ ํ•จ์ˆ˜์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, let๊ณผ const ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ ์—ฌ๋ถ€

var๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, let๊ณผ const๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ญ function()์˜ ์›๋ฆฌ

 

๐Ÿ’ฅํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ฆ„(์‹๋ณ„์ž)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์žˆ์–ด์•ผ ์Šค์ฝ”ํ”„์—์„œ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ฅ์—”์ง„์ด ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์„ ๋งŒ๋‚˜๋ฉด ์‹๋ณ„์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ง‘ํ•ฉ(EnviromentRecord)์— ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์‹๋ณ„์ž๋กœ ๋„ฃ๊ณ  ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ์‹คํ–‰ ๊ตฌ๋ฌธ ์ค‘ foo๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฐ’์„ ์Šค์ฝ”ํ”„๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ ๊ตฌ๋ฌธ์ด () ์ด๋ฏ€๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ฅ๋งŒ์•ฝ ์Šค์ฝ”ํ”„์—์„œ ์‹๋ณ„์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์ฐธ์กฐ ์—๋Ÿฌ(ReferenceError)๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์‹๋ณ„์ž๋Š” ์ฐพ์•˜์ง€๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์ด๋ผ๋ฉด ํƒ€์ž… ์—๋Ÿฌ(TypeError)๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

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

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

์ด ๊ณผ์ •์„ ์ดํ•ดํ• ๋ ค๋ฉด ์šฐ์„  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์ž์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š”๊ฐ€์— ๋Œ€ํ•ด์„œ ๋“ค์–ด๊ฐ€๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ง๋„ ์˜์‚ฌํ‘œํ˜„์„ ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋“ฏ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋‚˜๋ฆ„์˜ ์›์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐ŸŸฅ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context)

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

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

 

๐ŸŸฅ Global Execution Context

๋””ํดํŠธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์—”์ง„์— ์˜ํ•ด ์ฒ˜์Œ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ์ด๋‹ค.

 

๐ŸŸฅ Function Execution Context

์šฐ๋ฆฌ๊ฐ€ execution context๋ฅผ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์‹คํ–‰๋จ์— ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ปจํ…์ŠคํŠธ. ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋Š” ๊ณ ์œ ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ์–ธ์ œ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(1) Global Execution Context ์ƒ์„ฑ.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์—ด๋ฆฌ๋Š” ์ˆœ๊ฐ„(๋ณ„๋„์˜ ๋ช…๋ น ์—†์ด) ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  global execution context๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € callstack์— push๋œ๋‹ค. ์ง€๊ธˆ callstack์˜ ๋งจ ์œ„์—๋Š” global execution์ด ์žˆ์œผ๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ด์ œ ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์—์„œ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋‚ด๋ ค๊ฐ€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

(2) fooํ•จ์ˆ˜ ํ˜ธ์ถœ.

fooํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, Global Execution Context๋Š” ๋ฉˆ์ถ˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋งŒ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

(3) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ fooํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ foo execution context๋ฅผ ์ƒ์„ฑํ•œ ํ›„, callstack์— pushํ•œ๋‹ค. ์ด์ œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค.

(4) barํ•จ์ˆ˜ ํ˜ธ์ถœ. fooํ•จ์ˆ˜์˜ Execution Context๋Š” ๋ฉˆ์ถ˜๋‹ค.

(5) barํ•จ์ˆ˜์˜ Execution Context๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  callstack์— push๋œ๋‹ค. ์ฝ์–ด๋‚ด๋ ค๊ฐ„๋‹ค. console.logํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜์ธ a์˜ ๊ฐ’์ด ์ฝ˜์†”์ฐฝ์— ๋œธ์œผ๋กœ์จ console.logํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚œ๋‹ค.

(6) ๋” ์ฝ์–ด๋‚ด๋ ค๊ฐˆ ๊ฒŒ ์—†์œผ๋ฏ€๋กœ barํ•จ์ˆ˜์˜ Execution Context๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. callstack์—์„œ pop-out๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜ ๋ฐ”๋กœ ๋ฐ‘์˜ Execution Context, ์—ฌ๊ธฐ์—์„  fooํ•จ์ˆ˜์˜ Execution Context๊ฐ€ ๊ณ„์†๋œ๋‹ค.

(7) ๋” ์ฝ์–ด๋‚ด๋ ค๊ฐˆ ๊ฒŒ ์—†์œผ๋ฏ€๋กœ fooํ•จ์ˆ˜์˜ Execution Context๊ฐ€ ๋๋‚œ๋‹ค.

(8) ๋” ์ฝ์–ด๋‚ด๋ ค๊ฐˆ ๊ฒŒ ์—†์œผ๋ฏ€๋กœ Global Execution Context๊ฐ€ ๋๋‚œ๋‹ค.

 

 

๐ŸŸฅ callstack(์ฝœ์Šคํƒ)

call์€ ํ˜ธ์ถœ์„ ๋œปํ•œ๋‹ค.
stack์€ ์ถœ์ž…๊ตฌ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ๊นŠ์€ ์šฐ๋ฌผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋‹ค.

๋”ฐ๋ผ์„œ callstack์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์šฐ๋ฌผ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.

ํ•ญ์ƒ ๋งจ ์œ„์— ๋†“์ธ ํ•จ์ˆ˜๋ฅผ ์šฐ์„ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ€์žฅ ์œ„์— ์Œ“์—ฌ์žˆ๋Š” context์™€ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

 

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

 

๐ŸŸฅ ์Šค์ฝ”ํ”„ ์ฒด์ธ

ํ•จ์ˆ˜๋Š” ์ „์—ญ์—์„œ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•จ์ˆ˜ ๋ชธ์ฒด ๋‚ด๋ถ€์—์„œ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ๋ชธ์ฒด ๋‚ด๋ถ€์—์„œ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ๊ฒƒ์„ 'ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ', ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ '์™ธ๋ถ€ ํ•จ์ˆ˜'๋ผ๊ณ  ํ•œ๋‹ค.

ํ•จ์ˆ˜๋Š” ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„๋„ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์— ์˜ํ•ด ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์ค‘์ฒฉ ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ผ๊ณ  ์ง€์นญํ•œ๋‹ค.

var x = "global x";
var y = "global y";

function outer (){
  var z = "outer's local z";
  console.log(x); //global x
  console.log(y); //global y
  console.log(z); //outer's local z
  
  function inner (){
    var x = "inner's local x";
    console.log(x); //inner's local x
    console.log(y); //global y
    console.log(z); //outer's local z
  }
  inner();
}
outer();

console.log(x); //global x
console.log(z); //ReferenceError: z is not defined

์œ„์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” outer ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“  ์ง€์—ญ ์Šค์ฝ”ํ”„ ๋‚ด์— inner ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“  ์ง€์—ญ ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ outer ์Šค์ฝ”ํ”„๊ฐ€ inner ์Šค์ฝ”ํ”„์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ์Šค์ฝ”ํ”„์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„์ด๋‹ค.

์ด์ฒ˜๋Ÿผ ๋ชจ๋“  ์Šค์ฝ”ํ”„๋Š” ํ•˜๋‚˜์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ๋ชจ๋“  ์ง€์—ญ ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„์ด๋‹ค.

 

๐ŸŸฅ ์Šค์ฝ”ํ”„ ์ฒด์ธ์— ์˜ํ•œ ๋ณ€์ˆ˜ ๊ฒ€์ƒ‰

 

๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฝ”๋“œ์˜ ์Šค์ฝ”ํ”„์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ฐธ์กฐํ•  ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ํ•˜์œ„ ์Šค์ฝ”ํ”„์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ•˜์œ„ ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•œ ๋ณ€์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

 

๐ŸŸฅ ๋ณ€์ˆ˜ ์€๋‹‰ํ™”

 

๐Ÿ’ฅ ์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ํŠน์ง• ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ถœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์ •๋ณด ์€๋‹‰์ด๋ผ ํ•œ๋‹ค.

์ •๋ณด ์€๋‹‰์€ ์ ์ ˆ์น˜ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค.

 

๐Ÿ’ฅ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฉค๋ฒ„์— public, private, protected ๊ฐ™์€ ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์„ ์–ธํ•˜์—ฌ ๊ณต๊ฐœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ’ฌ ์‹ค์Šต๊ณผ์ œ 

let b = 1;
function hi () {
  const a = 1;
  let b = 100;
  b++;
  console.log(a,b); //const, let์€ ๋ธ”๋Ÿญ์Šค์ฝ”ํ”„์—์„œ ์œ ํšจํ•ด์„œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋“ค์— ์ ‘๊ทผ ํ›„ ์ถœ๋ ฅ
}

console.log(a); //Reference Error ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ
                //(a๋ณ€์ˆ˜๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š์•„์„œ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” let b = 1;์ชฝ์— let a= 1; ์ด๋Ÿฐ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•จ)
console.log(b); //let b=1์— ์ ‘๊ทผ(์ „์—ญ b๋ณ€์ˆ˜) 1์„ ์ถœ๋ ฅ
hi(); //ํ•จ์ˆ˜ ์‹คํ–‰ => 1, 101์„ ์ถœ๋ ฅ
console.log(b); //let b=1์— ์ ‘๊ทผ(์ „์—ญ b๋ณ€์ˆ˜) 1์„ ์ถœ๋ ฅ