๐Ÿ—‚๏ธ JavaScript ์š”์•ฝ์ •๋ฆฌ

๊น€์ˆ˜์ง„ยท2025๋…„ 5์›” 11์ผ

JavaScript๋ž€?

HTML, CSS์™€ ํ•จ๊ป˜ ์›น์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋Š” ์œ ์ผํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

1. ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

1.1 ๋ณ€์ˆ˜

๊ฐ’(value)์„ ์ €์žฅํ•˜๊ณ  ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž(identifier)
var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•˜๊ณ  = ์—ฐ์‚ฐ์ž๋กœ ํ• ๋‹น
๋™์  ํƒ€์ดํ•‘(dynamically typed): ์„ ์–ธ ์‹œ ํƒ€์ž… ์ง€์ • ์—†์Œ

1.2 ๊ฐ’

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ’์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€์ง
์›์‹œ ํƒ€์ž…: number, string, boolean, null, undefined, symbol
๊ฐ์ฒด ํƒ€์ž…: object (๋ฐฐ์—ด, ํ•จ์ˆ˜, ์ •๊ทœํ‘œํ˜„์‹ ๋“ฑ๋„ ๊ฐ์ฒด)
๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ง์ ‘ ๊ฐ’ ์ƒ์„ฑ

1.3 ์—ฐ์‚ฐ์ž

์‚ฐ์ˆ  (+, -, *, /), ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ (+),
ํ• ๋‹น (=), ๋น„๊ต (>, <, == ๋“ฑ), ๋…ผ๋ฆฌ (&&, ||),
ํƒ€์ž… (typeof), ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (new) ๋“ฑ
ํ”ผ์—ฐ์‚ฐ์ž ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜ ์ˆ˜ํ–‰

1.4 ํ‚ค์›Œ๋“œ

์–ธ์–ด์— ์˜ˆ์•ฝ๋œ ๋‹จ์–ด๋กœ ํŠน์ • ๋™์ž‘ ์ง€์‹œ
var, function, return, if, for, while, break

1.5 ์ฃผ์„

/* โ€ฆ */ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฝ”๋“œ ์„ค๋ช…

1.6 ๋ฌธ

์‹คํ–‰ ์‹œ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰
์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๋๋ƒ„
์ฝ”๋“œ ๋ธ”๋ก({ โ€ฆ })์œผ๋กœ ๊ทธ๋ฃนํ™” ๊ฐ€๋Šฅ

1.7 ํ‘œํ˜„์‹

ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ตฌ๋ฌธ
๋ฆฌํ„ฐ๋Ÿดยท์—ฐ์‚ฐยทํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ์ด ๋ชจ๋‘ ํ‘œํ˜„์‹

1.8 ๋ฌธ๊ณผ ํ‘œํ˜„์‹์˜ ๋น„๊ต

ํ‘œํ˜„์‹: ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋งŒ ๊ฐ€๋Šฅ
๋ฌธ: ๊ฐ’์„ ์ƒ์„ฑยท๋Œ€์ž…ํ•˜๊ฑฐ๋‚˜ ํ๋ฆ„ ์ œ์–ด ๋“ฑ ์‹คํ–‰ ๊ฐ€๋Šฅ

1.9 ํ•จ์ˆ˜

์ž‘์—… ๋‹จ์œ„์˜ ์ฝ”๋“œ ๋ธ”๋ก
์„ ์–ธ๋ฌธ: function name(params){ โ€ฆ }
ํ˜ธ์ถœ: name(args)

1.10 ๊ฐ์ฒด

ํ‚ค-๊ฐ’ ์Œ(property)์˜ ์ง‘ํ•ฉ
๋ฉ”์†Œ๋“œ(method): ๊ฐ’์ด ํ•จ์ˆ˜์ธ ํ”„๋กœํผํ‹ฐ
ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•ด ์ƒ์† ์‚ฌ์šฉ

1.11 ๋ฐฐ์—ด

์ˆœ์ฐจ์  ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ ๊ฐ์ฒด
์ธ๋ฑ์Šค๋กœ ์š”์†Œ ์ ‘๊ทผ
๋‹ค์–‘ํ•œ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ ์ œ๊ณต

2. ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜

2.1 ๋ฐ์ดํ„ฐ ํƒ€์ž…

2.1.1 ์›์‹œ ํƒ€์ž…

2.1.1.1 number

๋ชจ๋“  ์ˆ˜๋ฅผ 64๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์ ์œผ๋กœ ์ฒ˜๋ฆฌ
Infinity, -Infinity, NaN ํฌํ•จ

2.1.1.2 string

๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ํ…์ŠคํŠธ, ์ž‘์€/ํฐ ๋”ฐ์˜ดํ‘œ ๋˜๋Š” ๋ฐฑํ‹ฑ ์‚ฌ์šฉ

2.1.1.3 boolean

true ๋˜๋Š” false

2.1.1.4 undefined

์„ ์–ธ๋งŒ ํ•˜๊ณ  ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’

2.1.1.5 null

โ€œ๊ฐ’์ด ์—†์Œโ€์„ ๋ช…์‹œ

2.1.1.6 symbol

์œ ์ผ๋ฌด์ดํ•œ ์‹๋ณ„์ž์šฉ ์›์‹œ๊ฐ’

2.1.2 ๊ฐ์ฒด ํƒ€์ž… (Object type, Reference type)

ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ์œผ๋กœ, ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ ํฌํ•จ

2.2 ๋ณ€์ˆ˜

2.2.1 ๋ณ€์ˆ˜์˜ ์„ ์–ธ

var, let, const๋กœ ์„ ์–ธ = ์—ฐ์‚ฐ์ž๋กœ ํ• ๋‹น
์„ ์–ธ๋งŒ ํ•˜๋ฉด undefined, ์„ ์–ธ ์—†์ด ์ฐธ์กฐ ์‹œ ReferenceError

2.2.2 ๋™์  ํƒ€์ดํ•‘ (Dynamic Typing)

๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ ํƒ€์ž… ์ง€์ • ๋ถˆํ•„์š”
ํ• ๋‹น๋œ ๊ฐ’์— ๋”ฐ๋ผ ํƒ€์ž…์ด ์ž๋™ ๊ฒฐ์ •(typeof๋กœ ํ™•์ธ ๊ฐ€๋Šฅ)

2.2.3 ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Variable Hoisting)

var ์„ ์–ธ๋ฌธ์€ ์‹ค์ œ ์ฝ”๋“œ ์ตœ์ƒ๋‹จ์— ์„ ์–ธยท์ดˆ๊ธฐํ™”๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘
์„ ์–ธ ์ด์ „์— ์ฐธ์กฐํ•ด๋„ undefined๋ฅผ ๋ฐ˜ํ™˜

2.2.4 var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ 

  1. ํ•จ์ˆ˜ ๋‹จ์œ„ ์Šค์ฝ”ํ”„๋งŒ ์ œ๊ณต, ๋ธ”๋ก ๋‹จ์œ„ ์Šค์ฝ”ํ”„ ๋ฏธ์ง€์›
  2. ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ, ์„ ์–ธ ์ƒ๋žต ์‹œ ์•”๋ฌต์  ์ „์—ญ ์ƒ์„ฑ
  3. ์˜๋„์น˜ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ๊ฐ’ ๋ฎ์–ด์“ฐ๊ธฐ ์œ„ํ—˜

3. ์—ฐ์‚ฐ์ž

3.1 ํ‘œํ˜„์‹๊ณผ ์—ฐ์‚ฐ์ž

ํ‘œํ˜„์‹(expression): ํ‰๊ฐ€๋˜์–ด ํ•˜๋‚˜์˜ ๊ฐ’์ด ๋˜๋Š” ์ฝ”๋“œ
์—ฐ์‚ฐ์ž๋Š” ํ‘œํ˜„์‹์„ ๊ฒฐํ•ฉํ•ด ์ƒˆ ๊ฐ’์„ ๋งŒ๋“ ๋‹ค

3.2 ๋ฌธ๊ณผ ํ‘œํ˜„์‹

๋ฌธ(statement): ์‹คํ–‰ ์‹œ ๋™์ž‘์„ ์ˆ˜ํ–‰ (var, if, for ๋“ฑ)
ํ‘œํ˜„์‹์€ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€
๋ฌธ์€ ์ œ์–ด ํ๋ฆ„์ด๋‚˜ ์„ ์–ธ ๋“ฑ

3.3 ์—ฐ์‚ฐ์ž๋ž€?

ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”ผ์—ฐ์‚ฐ์ž(operand)๋ฅผ ์ฒ˜๋ฆฌํ•ด ๊ฐ’์„ ์ƒ์„ฑ
์‚ฐ์ˆ ยทํ• ๋‹นยท๋น„๊ตยท๋…ผ๋ฆฌยทํƒ€์ž… ์—ฐ์‚ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜

3.4 ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

์ˆ˜ํ•™์  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด ์ƒˆ๋กœ์šด ์ˆซ์ž ๊ฐ’์„ ๋งŒ๋“ ๋‹ค
์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” NaN์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

3.4.1 ์ดํ•ญ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž์˜๋ฏธ
+๋ง์…ˆ
-๋บ„์…ˆ
*๊ณฑ์…ˆ
/๋‚˜๋ˆ—์…ˆ
%๋‚˜๋จธ์ง€

3.4.2 ๋‹จํ•ญ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž์˜๋ฏธ
++์ฆ๊ฐ€ (ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ, ์œ„์น˜์— ๋”ฐ๋ผ ์„ ์œ„/ํ›„์œ„ ์ฆ๊ฐ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง)
--๊ฐ์†Œ (ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์„ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚ค๋ฉฐ, ์œ„์น˜์— ๋”ฐ๋ผ ์„ ์œ„/ํ›„์œ„ ์ฆ๊ฐ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง)
+๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž: ์•„๋ฌด๋Ÿฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ์—†์ด ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜
-๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž: ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋ถ€ํ˜ธ๋ฅผ ๋ฐ˜์ „ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ (์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜๋กœ, ์–‘์ˆ˜๋ฅผ ์Œ์ˆ˜๋กœ), ์ˆซ์ž ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ’์€ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ํ›„ ๋ถ€ํ˜ธ ๋ฐ˜์ „

3.4.3 ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž

+: ํ”ผ์—ฐ์‚ฐ์ž ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌธ์ž์—ด์ด๋ฉด ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ

3.5 ํ• ๋‹น ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž์‚ฌ๋ก€๋™์ผ ํ‘œํ˜„
=x = yx = y
+=x += yx = x + y
-=x -= yx = x - y
*=x *= yx = x * y
/=x /= yx = x / y
%=x %= yx = x % y

3.6 ๋น„๊ต ์—ฐ์‚ฐ์ž

์ขŒํ•ญ๊ณผ ์šฐํ•ญ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋น„๊ตํ•˜์—ฌ boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

3.6.1 ๋™๋“ฑ / ์ผ์น˜ ๋น„๊ต ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž์„ค๋ช…
==๋™๋“ฑ ๋น„๊ต: ๊ฐ’๋งŒ ๊ฐ™์œผ๋ฉด true (x == y)
===์ผ์น˜ ๋น„๊ต: ๊ฐ’๊ณผ ํƒ€์ž… ๋ชจ๋‘ ๊ฐ™์•„์•ผ true (x === y)
!=๋ถ€๋“ฑ ๋น„๊ต: ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด true (x != y)
!==๋ถˆ์ผ์น˜ ๋น„๊ต: ๊ฐ’ ๋˜๋Š” ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด true (x !== y)

3.6.2 ๋Œ€์†Œ ๊ด€๊ณ„ ๋น„๊ต ์—ฐ์‚ฐ์ž

์—ฐ์‚ฐ์ž์‚ฌ๋ก€์„ค๋ช…
>x > yx๊ฐ€ y๋ณด๋‹ค ํฌ๋‹ค
<x < yx๊ฐ€ y๋ณด๋‹ค ์ž‘๋‹ค
>=x >= yx๊ฐ€ y๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค
<=x <= yx๊ฐ€ y๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘๋‹ค

3.7 ์‚ผํ•ญ ์กฐ๊ฑด ์—ฐ์‚ฐ์ž

๋ฌธ๋ฒ•: ์กฐ๊ฑด์‹ ? ์ฐธ๊ฐ’ : ๊ฑฐ์ง“๊ฐ’
ํ‘œํ˜„์‹์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

3.8 ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž

&& (AND), || (OR): ํ”ผ์—ฐ์‚ฐ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜, ๋‹จ์ถ• ํ‰๊ฐ€
! (NOT): ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ๋ณ€ํ™˜ ํ›„ ๋ฐ˜์ „

3.9 ์‰ผํ‘œ ์—ฐ์‚ฐ์ž

,: ์—ฌ๋Ÿฌ ํ‘œํ˜„์‹์„ ์ˆœ์ฐจ ํ‰๊ฐ€ ํ›„ ๋งˆ์ง€๋ง‰ ๊ฐ’ ๋ฐ˜ํ™˜

3.10 ๊ทธ๋ฃน ์—ฐ์‚ฐ์ž

(...): ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด, ๊ด„ํ˜ธ ์•ˆ์„ ๋จผ์ € ํ‰๊ฐ€

3.11 typeof ์—ฐ์‚ฐ์ž

typeof x: ํ”ผ์—ฐ์‚ฐ์ž์˜ ํƒ€์ž…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
์ฃผ์˜: typeof null์€ "object", ์„ ์–ธ ์•ˆ ๋œ ์‹๋ณ„์ž๋Š” "undefined" ๋ฐ˜ํ™˜

4. ์ œ์–ด๋ฌธ

4.1 ๋ธ”๋ก๋ฌธ

{ โ€ฆ }๋กœ ๋ฌถ์ธ ๋ฌธ๋“ค์˜ ์ง‘ํ•ฉ

4.2 ์กฐ๊ฑด๋ฌธ

ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ฝ”๋“œ ๋ธ”๋Ÿญ(๋ธ”๋ก๋ฌธ)์˜ ์‹คํ–‰์„ ๊ฒฐ์ •

4.2.1 if..else ๋ฌธ

if (์กฐ๊ฑด) { โ€ฆ } else if (์กฐ๊ฑด) { โ€ฆ } else { โ€ฆ }

์กฐ๊ฑด์€ ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ํ‰๊ฐ€, ์ค‘๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ
์‚ผํ•ญ ์กฐ๊ฑด ์—ฐ์‚ฐ์ž๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ

4.2.2 switch ๋ฌธ

switch (๊ฐ’) { case A: โ€ฆ; break; โ€ฆ; default: โ€ฆ }

์ผ์น˜ํ•˜๋Š” case๋กœ ์ ํ”„, break๋กœ ํด์Šค๋ฃจ ๋ฐฉ์ง€
์—ฌ๋Ÿฌ case ๋ฌถ๊ฑฐ๋‚˜ default ์ƒ๋žต ๊ฐ€๋Šฅ

4.3 ๋ฐ˜๋ณต๋ฌธ

ํ‰๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ ์ฐธ์ธ ๊ฒฝ์šฐ ์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ์‹คํ–‰

4.3.1 for ๋ฌธ

for (์ดˆ๊ธฐ; ์กฐ๊ฑด; ์ฆ๊ฐ) { โ€ฆ }

์ดˆ๊ธฐโ†’์กฐ๊ฑดโ†’๋ธ”๋กโ†’์ฆ๊ฐ ์ˆœ์œผ๋กœ ๋ฐ˜๋ณต
์ดˆ๊ธฐยท์กฐ๊ฑดยท์ฆ๊ฐ ๋ชจ๋‘ ์ƒ๋žตํ•˜๋ฉด ๋ฌดํ•œ ๋ฃจํ”„

4.3.2 while ๋ฌธ

while (์กฐ๊ฑด) { โ€ฆ }

์กฐ๊ฑด์ด ์ฐธ์ธ ๋™์•ˆ ๋ฐ˜๋ณต, ๋ฌดํ•œ ๋ฃจํ”„ ์‹œ break๋กœ ํƒˆ์ถœ

4.3.3 doโ€ฆwhile ๋ฌธ

do { โ€ฆ } while (์กฐ๊ฑด);

๋ณธ๋ฌธ์„ ์ตœ์†Œ ํ•œ ๋ฒˆ ์‹คํ–‰ ํ›„ ์กฐ๊ฑด ๊ฒ€์‚ฌ

4.4 break ๋ฌธ

break; ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ˜๋ณต๋ฌธ ๋˜๋Š” switch ํƒˆ์ถœ

๋ฐ˜๋ณต๋ฌธ์„ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋  ๋•Œ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ํšŒํ”ผ

4.5 continue ๋ฌธ

continue; ๋กœ ๋ฐ˜๋ณต๋ฌธ์˜ ํ˜„์žฌ ์ˆœํ™˜๋งŒ ์ค‘๋‹จํ•˜๊ณ  ์ฆ๊ฐ์‹์œผ๋กœ ์ด๋™

๋ถˆํ•„์š”ํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐฉ์ง€์šฉ์œผ๋กœ ํ™œ์šฉ

5. ํƒ€์ž… ๋ณ€ํ™˜๊ณผ ๋‹จ์ถ• ํ‰๊ฐ€

5.1 ํƒ€์ž… ๋ณ€ํ™˜

์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜ & ๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜ ์œผ๋กœ ๊ตฌ๋ถ„

5.2 ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜

์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜: ์—ฐ์‚ฐ๋ฌธ๋งฅ์— ๋งž์ถฐ JS ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ณ€ํ™˜

5.2.1 ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

๋ฌธ์ž์—ด ์—ฐ๊ฒฐ(+): ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฌธ์ž์—ด์ด๋ฉด ๋‹ค๋ฅธ ๊ฐ’์„ ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

5.2.2 ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

์‚ฐ์ˆ ยท๋น„๊ต ์—ฐ์‚ฐ๋ฌธ๋งฅ: ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์ˆซ์ž๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜, ์‹คํŒจ ์‹œ NaN

'5' * 2      // 10
'a' - 1      // NaN
'3' > 1      // true

5.2.3 ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

์กฐ๊ฑด๋ฌธยท๋…ผ๋ฆฌ ์—ฐ์‚ฐ๋ฌธ๋งฅ: ๊ฐ’์ด Falsy(0, '' ๋นˆ ๋ฌธ์ž์—ด, null, undefined, NaN, false)๋ฉด false, ๊ทธ ์™ธ๋Š” true

5.3 ๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜

๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜(ํƒ€์ž… ์บ์ŠคํŒ…): ๊ฐœ๋ฐœ์ž๊ฐ€ toString(), Number(), Boolean() ๋“ฑ์œผ๋กœ ์ง์ ‘ ๋ณ€ํ™˜

5.3.1 ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

String(x), x.toString(), x + ''

String(1)    // "1"
(1).toString() // "1"
1 + ''      // "1"

5.3.2 ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

Number(x), parseInt(x), +x, x * 1

Number('2')  // 2
parseInt('2')// 2
+'2'         // 2
'2' * 1      // 2

5.3.3 ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

Boolean(x), !!x

Boolean(0)   // false
!!{}         // true

5.4 ๋‹จ์ถ• ํ‰๊ฐ€

๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž &&, ||๋Š” ๊ฒฐ๊ณผ ๊ฒฐ์ • ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜

๋‹จ์ถ• ํ‰๊ฐ€ ํ‘œํ˜„์‹ํ‰๊ฐ€ ๊ฒฐ๊ณผ
true // anythingtrue
false // anythinganything
true && anythinganything
false && anythingfalse

6. ๊ฐ์ฒด

6.1 ๊ฐ์ฒด(Object)๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ์–ธ์–ด
ํ‚ค(key) ์™€ ๊ฐ’(value) ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ(property) ๋“ค์˜ ์ง‘ํ•ฉ
ํ•จ์ˆ˜๋„ ๊ฐ’์ด๋ฏ€๋กœ, ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ†’ ๋ฉ”์†Œ๋“œ(method)

6.1.1 ํ”„๋กœํผํ‹ฐ

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

6.1.2 ๋ฉ”์†Œ๋“œ

ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๊ฐ์ฒด์˜ ๋™์ž‘(ํ–‰์œ„)์„ ์ •์˜

6.2 ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

javascript๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋กœ์„œ ํด๋ž˜์Šค๋ผ๋Š” ๊ฐœ๋…์ด ์—†๊ณ  ๋ณ„๋„์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ์กด์žฌ

6.2.1 ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด

{} ์‚ฌ์šฉ
๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹

var person = { name: 'Kim', gender: 'female' };

6.2.2 Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

new Object()๋กœ ์ƒ์„ฑ ํ›„ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹๋ณด๋‹ค ๋ณต์žกํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

6.2.3 ์ƒ์„ฑ์ž ํ•จ์ˆ˜

  1. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘
  2. ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ช… ์•ž์— ๊ธฐ์ˆ ํ•œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค(instance)์ด๋‹ค
  3. this์— ์—ฐ๊ฒฐ(๋ฐ”์ธ๋”ฉ)๋˜์–ด ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋Š” public(์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ)์ด๋‹ค
  4. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” private(์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€๋Šฅ)์ด๋‹ค

6.3 ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ

6.3.1 ํ”„๋กœํผํ‹ฐ ํ‚ค

์œ ํšจํ•œ ์‹๋ณ„์ž๋Š” ๋”ฐ์˜ดํ‘œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋”ฐ์˜ดํ‘œ ํ•„์š”)
ํ‘œํ˜„์‹ ํ‚ค๋Š” []๋กœ ๋ฌถ์–ด ์‚ฌ์šฉ.

6.3.2 ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ฝ๊ธฐ

. ๋˜๋Š” []ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ
[]๋Š” ๋ฌธ์ž์—ด ๋˜๋Š” ํ‘œํ˜„์‹ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์‹œ undefined ๋ฐ˜ํ™˜

6.3.3 ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฐฑ์‹ 

๊ธฐ์กด ํ”„๋กœํผํ‹ฐ์— ์ƒˆ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๊ฐ’์ด ๊ฐฑ์‹ 

6.3.4 ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ

์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์ƒˆ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ

6.3.5 ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ

delete ์—ฐ์‚ฐ์ž๋กœ ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ ๊ฐ€๋Šฅ

6.3.6 for-in ๋ฌธ

๊ฐ์ฒด์˜ ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋ฃจํ”„ ์ˆ˜ํ–‰
๋ฐฐ์—ด์— ์‚ฌ์šฉ ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

var person = {
  name: 'Kim',
  age: 22,
  gender: 'female'
};

for (var key in person) {
  console.log(key + ': ' + person[key]);
}

6.4 Pass-by-reference

๊ฐ์ฒด๋Š” ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ๋จ
์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ํ•œ์ชฝ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์ชฝ์—๋„ ๋ฐ˜์˜๋œ๋‹ค

6.5 Pass-by-value

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

6.6 ๊ฐ์ฒด์˜ ๋ถ„๋ฅ˜

Built-in Object: JS ์—”์ง„์— ๋‚ด์žฅ (์˜ˆ: Object, Array, Function ๋“ฑ)
Native Object: BOM/DOM ๊ด€๋ จ ๊ฐ์ฒด (์˜ˆ: window, document ๋“ฑ)
Host Object: ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด

7. ๊ฐ์ฒด์™€ ๋ณ€๊ฒฝ๋ถˆ๊ฐ€์„ฑ(Immutability)

7.1 immutable value vs. mutable value

Immutable Value (๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’)

JavaScript์˜ ์›์‹œ ํƒ€์ž… (Boolean, null, undefined, Number, String, Symbol) ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธฐ์กด ๊ฐ’ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†๋‹ค

let str = 'Hello';
str = 'World'; // 'Hello'๋Š” ๊ทธ๋Œ€๋กœ, 'World'๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋จ

Mutable Value (๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’)

๊ฐ์ฒด(Object)๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฉฐ, ์ง์ ‘ ์ˆ˜์ •์ด ๊ฐ€๋Šฅ
๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์€ ์›๋ณธ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค

var arr = [];
arr.push(2); // ์›๋ณธ ๋ฐฐ์—ด(arr)์ด ์ง์ ‘ ๋ณ€๊ฒฝ๋จ

7.2 ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ํŒจํ„ด(immutable data pattern)

์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์˜ ๋Œ€๋‹ค์ˆ˜๋Š” โ€œ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐํ•œ ๋‹ค๋ฅธ ๊ฐ์ฒด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝโ€ํ•˜๊ธฐ ๋•Œ๋ฌธ -> ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ํ”„๋กœํผํ‹ฐ์˜ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€

7.2.1 Object.assign

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ
์–•์€ ๋ณต์‚ฌ(shallow copy)๋ฅผ ํ•˜๋ฏ€๋กœ ์ค‘์ฒฉ ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋จ

7.2.2 Object.freeze

๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œ๋ฅผ ๋ง‰์Œ
์ค‘์ฒฉ ๊ฐ์ฒด๋Š” ๋™๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ ๊ฐ์ฒด๊นŒ์ง€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด deep freeze ํ•„์š”

7.2.3 Immutable.js

Map, List, Set ๋“ฑ ๋‹ค์–‘ํ•œ ๊ตฌ์กฐ ์ง€์›
๊ฐ์ฒด ์ˆ˜์ • ์‹œ ๊ธฐ์กด ๊ฐ์ฒด๋Š” ์œ ์ง€๋˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

8. ํ•จ์ˆ˜

์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฌธ(statement)๋“ค์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•œ ์ฝ”๋“œ ๋ธ”๋ก

8.1 ํ•จ์ˆ˜ ์ •์˜

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  1. ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
  2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹
  3. Function ์ƒ์„ฑ์ž ํ•จ์ˆ˜

8.1.1 ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

function ํ•จ์ˆ˜๋ช…() {}
ํ˜ธ์ด์ŠคํŒ…๋˜์–ด ์„ ์–ธ ์ด์ „์—๋„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

8.1.2 ํ•จ์ˆ˜ ํ‘œํ˜„์‹

๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ํ• ๋‹น
์ต๋ช… ํ•จ์ˆ˜ ๊ฐ€๋Šฅ

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

console.log(add(3, 4)); // 7

ํ˜ธ์ด์ŠคํŒ… ์‹œ undefined๋กœ ์ดˆ๊ธฐํ™”๋จ

8.1.3 Function ์ƒ์„ฑ์ž ํ•จ์ˆ˜

new Function('param', 'body')๋กœ ์ •์˜
์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

8.2 ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์ฝ”๋“œ์˜ ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ ธ ๋จผ์ € ์‹คํ–‰ ๊ฐ€๋Šฅ
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๋งŒ ๋˜์–ด ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

sayHello(); // ์‹คํ–‰ ๊ฐ€๋Šฅ

function sayHello() {
  console.log("์•ˆ๋…•ํ•˜์„ธ์š”!");
}

8.3 First-class object (์ผ๊ธ‰ ๊ฐ์ฒด)

์ผ๊ธ‰ ๊ฐ์ฒด ์กฐ๊ฑด

  1. ๋ฌด๋ช…์˜ ๋ฆฌํ„ฐ๋Ÿด๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ(๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ)์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

=> JavaScript์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰๊ฐ์ฒด

8.4 ๋งค๊ฐœ๋ณ€์ˆ˜(Parameter, ์ธ์ž)

8.4.1 ๋งค๊ฐœ๋ณ€์ˆ˜(parameter, ์ธ์ž) vs ์ธ์ˆ˜(argument)

parameter: ํ•จ์ˆ˜ ์ •์˜ ์‹œ ์‚ฌ์šฉ
argument: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ

8.4.2 Call-by-value

์›์‹œ๊ฐ’์€ ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ
ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์›์‹œ ํƒ€์ž… ์ธ์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์ด ์›๋ณธ์— ์˜ํ–ฅ ์—†๋‹ค

8.4.3 Call-by-reference

๊ฐ์ฒด๋Š” ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ
ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ฐธ์กฐ ํƒ€์ž… ์ธ์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์ด ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹
ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์ด ์›๋ณธ ๊ฐ์ฒด์— ์˜ํ–ฅ

8.5 ๋ฐ˜ํ™˜๊ฐ’

return์„ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜
์ƒ๋žต ์‹œ undefined
๋ฐฐ์—ด ๋“ฑ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ’ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ

8.6 ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ

8.6.1 arguments ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ์œ ์‚ฌ ๋ฐฐ์—ด๋กœ ์ œ๊ณต
๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜์— ์œ ์šฉ

8.6.2 caller ํ”„๋กœํผํ‹ฐ

์ž์‹ ์„ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜ ์ฐธ์กฐ
๋””๋ฒ„๊น… ๋“ฑ์— ์‚ฌ์šฉ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

8.6.3 length ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜ ์ •์˜ ์‹œ ๋ช…์‹œํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐฏ์ˆ˜

8.6.4 name ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜๋ช…
์ต๋ช… ํ•จ์ˆ˜๋Š” ๋นˆ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜

8.6.5 proto ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ์ฒด๊ฐ„์˜ ์ƒ์† ๊ตฌํ˜„

8.6.6 prototype ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ์ด ๊ฐ€์ง€๋Š” ํ”„๋กœํผํ‹ฐ

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ์‹œ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ์—ญํ• 

8.7 ํ•จ์ˆ˜์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ

8.7.1 ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜

์ •์˜์™€ ๋™์‹œ์— ์‹คํ–‰
๋ณ€์ˆ˜/ํ•จ์ˆ˜ ์ถฉ๋Œ ๋ฐฉ์ง€์— ์œ ์šฉ

(function() {
  console.log('์ฆ‰์‹œ ์‹คํ–‰!');
})();

8.7.2 ๋‚ด๋ถ€ ํ•จ์ˆ˜

๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ถ€๋ชจ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๋ถˆ๊ฐ€
๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค

function parent(param) {
  var parentVar = param;
  function child() {
    var childVar = 'kim';
    console.log(parentVar + ' ' + childVar); // OK
  }
  child();
  console.log(childVar); // ์˜ค๋ฅ˜ ๋ฐœ์ƒ
}

8.7.3 ์žฌ๊ท€ ํ•จ์ˆ˜

์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
๋ฐ˜๋“œ์‹œ ์ข…๋ฃŒ ์กฐ๊ฑด(ํƒˆ์ถœ ์กฐ๊ฑด) ์ด ์žˆ์–ด์•ผ ๋ฌดํ•œ ํ˜ธ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ง๊ด€์ ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์ง

function factorial(n) {
  if (n < 2) return 1;
  return factorial(n - 1) * n;
}

8.7.4 ์ฝœ๋ฐฑ ํ•จ์ˆ˜

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

9. ํƒ€์ž… ์ฒดํฌ

JavaScript๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด์ด๋ฏ€๋กœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์‚ฌ์ „์— ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋กœ ์ธํ•ด ์˜๋„์น˜ ์•Š์€ ํƒ€์ž…์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์–ด, ํƒ€์ž… ์ฒดํฌ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

9.1 typeof

ํ”ผ์—ฐ์‚ฐ์ž์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜

typeof '';             // 'string'
typeof 1;              // 'number'
typeof NaN;            // 'number'
typeof true;           // 'boolean'
typeof [];             // 'object'
typeof {};             // 'object'
typeof function() {};  // 'function'
typeof null;           // 'object' (์„ค๊ณ„์ƒ ์˜ค๋ฅ˜)
typeof undefined;      // 'undefined'

๋‹จ์ : ๋ฐฐ์—ด, null, Date ๋“ฑ ๊ฐ์ฒด์˜ ์„ธ๋ถ€ ํƒ€์ž…์€ ํŒ๋ณ„ ๋ถˆ๊ฐ€

9.2 Object.prototype.toString

๋ชจ๋“  ๊ฐ’์˜ ์ •ํ™•ํ•œ ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
Object.prototype.toString.call(value) ํ˜•ํƒœ

function getType(target) {
  return Object.prototype.toString.call(target).slice(8, -1);
}

9.3 instanceof

๊ฐ์ฒด๊ฐ€ ํŠน์ • ์ƒ์„ฑ์ž(constructor)์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ
ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ผ์น˜ ์—ฌ๋ถ€ ํŒ๋‹จ

console.log(person instanceof Person); // true

9.4 ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด

๋ฐฐ์—ด์ฒ˜๋Ÿผ length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
์˜ˆ: arguments, NodeList, HTMLCollection, ๋ฌธ์ž์—ด
Array.isArray ํ˜•ํƒœ

console.log(Array.isArray([]));    // true

10. ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด

10.1 ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]]์„ ํ†ตํ•ด ๋ถ€๋ชจ ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ์ƒ์†์„ ํ†ตํ•ด ๋ถ€๋ชจ์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

10.2 [[Prototype]] vs prototype ํ”„๋กœํผํ‹ฐ

[[Prototype]]: ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ, ์ž์‹ ์˜ ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด (__proto__๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ)

prototype: ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ ๊ฐ€์ง€๋ฉฐ, ์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.

10.3 constructor ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” constructor ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง
ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐ

function Person(name) {
  this.name = name;
}
const foo = new Person('kim');
console.log(foo.constructor === Person); // true

10.4 Prototype chain

๊ฐ์ฒด์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด [[Prototype]]์„ ๋”ฐ๋ผ ์ƒ์† ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊ฒ€์ƒ‰

10.4.1 ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด โ†’ Object() ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ
ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์€ Object.prototype

๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•
1. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
2. ์ƒ์„ฑ์ž ํ•จ์ˆ˜
3. Object() ์ƒ์„ฑ์ž ํ•จ์ˆ˜

10.4.2 ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์ด ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๋œ๋‹ค
์ด prototype๋„ Object.prototype์„ ์ƒ์†

function Person(name) { this.name = name; }
const foo = new Person('Lee');
console.log(foo.__proto__ === Person.prototype); // true

10.5 ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ™•์žฅ

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ
์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํ”„๋กœํ† ํƒ€์ž…์„ ์ƒ์†ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Person.prototype.sayHello = function() {
  console.log('Hello');
};

10.6 ์›์‹œ ํƒ€์ž…(Primitive data type)์˜ ํ™•์žฅ

์›์‹œ๊ฐ’๋„ ์ž„์‹œ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์ ธ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
String.prototype ๋“ฑ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์›์‹œ ๋ฌธ์ž์—ด๋„ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

String.prototype.myMethod = function() {
  return 'extended';
};
console.log('abc'.myMethod()); // 'extended'

10.7 ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ๋ณ€๊ฒฝ ์ดํ›„ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์—๋งŒ ๋ฐ˜์˜๋จ
๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋Š” ์ด์ „ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ณ„์† ์ฐธ์กฐ

function Person(name) { this.name = name; }
const foo = new Person('Lee');
Person.prototype = { gender: 'male' };
const bar = new Person('Kim');
console.log(foo.gender); // undefined
console.log(bar.gender); // 'male'

10.8 ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋™์ž‘ ์กฐ๊ฑด

์ฐธ์กฐ(์ฝ๊ธฐ) ์‹œ: ํ•ด๋‹น ๊ฐ์ฒด์— ์—†์œผ๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋™์ž‘
ํ• ๋‹น(์“ฐ๊ธฐ) ์‹œ: ์ฒด์ธ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์— ์ง์ ‘ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •

foo.gender = 'female'; // foo์— gender ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋จ

11. ์Šค์ฝ”ํ”„

11.1 ์Šค์ฝ”ํ”„๋ž€?

์Šค์ฝ”ํ”„(Scope) ๋Š” ์‹๋ณ„์ž๊ฐ€ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹๋ณ„์ž๋ฅผ ์ฐพ์„ ๋•Œ, ์„ ์–ธ๋œ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ผ ์‹๋ณ„์ž๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค
์Šค์ฝ”ํ”„๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ์ „์—ญ์ด ๋˜์–ด ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ๋‹ค

11.2 ์Šค์ฝ”ํ”„์˜ ๊ตฌ๋ถ„

์ „์—ญ ์Šค์ฝ”ํ”„: ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ

์ง€์—ญ ์Šค์ฝ”ํ”„: ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๋ณ€์ˆ˜๋Š” ์„ ์–ธ ์œ„์น˜์— ๋”ฐ๋ผ ์ „์—ญ ๋˜๋Š” ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค

11.3 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค์ฝ”ํ”„์˜ ํŠน์ง•

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(function-level scope) ๋ฅผ ๋”ฐ๋ฅธ๋‹ค
๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(block-level scope) ๋Š” let๊ณผ const ์‚ฌ์šฉ ์‹œ์—๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค

11.4 ์ „์—ญ ์Šค์ฝ”ํ”„(Global scope)

์ „์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ
var๋กœ ์„ ์–ธํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋Š” window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ ์ง„์ž…์ (main ํ•จ์ˆ˜ ๋“ฑ)์ด ์—†์–ด ์ „์—ญ ๋ณ€์ˆ˜ ๋‚จ์šฉ์ด ์‰ฌ์›€ โ†’ ์ง€์–‘ํ•ด์•ผ ํ•จ

11.5 ๋น„ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Non block-level scope)

var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋„ ์ „์—ญ ๋˜๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค

if (true) {
  var x = 5;
}
console.log(x); // 5

11.6 ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Function-level scope)

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจ
์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์—๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
๋ณ€์ˆ˜๋ช…์ด ์ค‘๋ณต๋˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๊ฐ€ ์šฐ์„ ๋œ๋‹ค (์Šค์ฝ”ํ”„ ์ฒด์ธ)

11.7 ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

์„ ์–ธ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค
ํ˜ธ์ถœ ์œ„์น˜์™€ ๊ด€๊ณ„์—†์ด ์ •์˜๋œ ์œ„์น˜์˜ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ฅธ๋‹ค

var x = 1;

function foo() {
  var x = 10;
  bar();
}

function bar() {
  console.log(x); // 1
}

foo();

11.8 ์•”๋ฌต์  ์ „์—ญ

์„ ์–ธํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค
๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ, delete๋กœ ์‚ญ์ œ ๊ฐ€๋Šฅ

function foo() {
  y = 20; // ์•”๋ฌต์  ์ „์—ญ
}

11.9 ์ตœ์†Œํ•œ์˜ ์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ

์ „์—ญ ๊ฐ์ฒด ํ•˜๋‚˜(MYAPP ๋“ฑ) ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ๋“  ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ทธ ์•ˆ์— ๊ด€๋ฆฌ

var MYAPP = {
  student: {
    name: 'Lee',
    gender: 'male'
  }
};

11.10 ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ „์—ญ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์–ต์ œ

IIFE(Immediately-Invoked Function Expression)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ „์—ญ ์˜ค์—ผ ๋ฐฉ์ง€ํ•œ๋‹ค

(function() {
  var MYAPP = { student: { name: 'Lee' } };
})();

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