본문으둜 κ±΄λ„ˆλ›°κΈ°

200228

Β· μ•½ 12λΆ„

0228#

ν† μ΅μŠ€ν”Όν‚Ή#

"μ‘Έμ—… μš”κ±΄" + "μ·¨μ—…"

두 가지 λͺ©μ μ„ μœ„ν•΄ ν† μ΅μŠ€ν”Όν‚Ή μ‹œν—˜μ„ μ€€λΉ„ν–ˆλ‹€.

μ‘Έμ—… μš”κ±΄μ€ Lv.5, μ·¨μ—…μ—λŠ” μ΅œμ†Œ Lv.6λ₯Ό μš”κ΅¬ν•˜λŠ” νšŒμ‚¬κ°€ λ§Žμ•˜λ‹€.

λͺ©ν‘œλŠ” 내심 Lv.7을 κΈ°λŒ€ν•˜λ©΄μ„œ Lv.6둜 μž‘μ•˜λ‹€. (μ§€κΈˆ 생각해보면 μ°Έ μ•ˆμΌν–ˆλ˜ λͺ©ν‘œμ„€μ •)

  • 독학 (유튜브)

  • 인터넷 κ°•μ˜

  • 학원

3가지 선택지가 μžˆμ—ˆλŠ”λ°, λΉ λ₯Έ μ‹œκ°„ μ•ˆμ— 점수λ₯Ό μ–»κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— + ν† μ΅μŠ€ν”Όν‚Ήμ‹œν—˜μ˜ 성격을 μ „ν˜€ λͺ°λžκΈ° λ•Œλ¬Έμ—, κ·Έλƒ₯ 학원을 λ‹€λ‹ˆκΈ°λ‘œ ν–ˆλ‹€.

μ•ˆμΌν•œ λͺ©ν‘œμ™€ μˆ˜λ™μ μœΌλ‘œ 학원에 μ˜μ‘΄ν•  μƒκ°μœΌλ‘œ μ‹œμž‘ν•΄μ„œ κ·ΈλŸ°μ§€ 학원 μˆ˜μ—…κ³Ό μŠ€ν„°λ””μ—μ„œλŠ” μ—΄μ‹¬νžˆ κ³΅λΆ€ν•˜κ³ , λ”°λ‘œ μ‹œκ°„μ„ λ‚΄μ„œ κ³΅λΆ€ν•˜μ§€λŠ” μ•Šκ²Œ λ˜μ—ˆλ‹€. μ§€κΈˆ μƒκ°ν•΄λ³΄λ‹ˆ λ‹Ήμ—°ν•œ κ²°κ³Όμ˜€λ‹€.

μ΄λ ‡κ²Œ μ˜€μ „ ꡐ내 κ·Όλ‘œμ™€ μ˜€ν›„ 학원을 λ³‘ν–‰ν•˜λ‹ˆ ( 집 -> 학ꡐ -> 강남 -> 집 의 살인적인 톡학 μŠ€μΌ€μ₯΄..) 2μ£Όκ°€ μˆœμ‹κ°„μ— μ§€λ‚˜κ°”κ³ , μ—΄μ‹¬νžˆ κ³΅λΆ€ν•˜μ§€ μ•Šμ€ 탓에 λ‹Ήμž₯ μ‹œν—˜λ³Ό μžμ‹ μ΄ μ—†μ–΄ 1μ£Όκ°„ μΆ”κ°€λ‘œ 독학을 ν–ˆλ‹€.

ν† μ΅μŠ€ν”Όν‚Ήμ€ μŠ€ν”Όν‚Ή μ‹œν—˜μ΄κΈ° λ•Œλ¬Έμ— 직접 μ†Œλ¦¬λ‚΄μ–΄μ„œ κ³΅λΆ€ν•΄μ•Όν–ˆκ³ , κ·Έλž˜μ„œ μ§‘μ—μ„œκ³΅λΆ€λ₯Ό ν–ˆλ‹€. κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ 문제 μ˜€λ””μ˜€ νŒŒμΌλ„ 직접 μž¬μƒν•΄μ•Όν•˜κ³ , 직접 μ‹œκ°„μ„ μž¬μ•Όν•˜κ³ , λ…ΉμŒκΈ°λ„ ν‚€λŠ” λ“± 이것저것 μ‹ κ²½μ“°λ©΄μ„œ 곡뢀해야 ν–ˆλ‹€.

그런데 μ‹œν—˜μž₯에 κ°€λ‹ˆ μŠ€ν”Όν‚Ήν•˜κΈ° 쒋은(?) ν™˜κ²½μ—μ„œ μ–΄λŠ μ •λ„μ˜ κΈ΄μž₯감과 ν•¨κ»˜ μ‹œν—˜μ„ μΉ˜λ£¨λ‹ˆ 였히렀 λͺ¨μ˜κ³ μ‚¬ ν’€ λ•Œλ³΄λ‹€ μ§‘μ€‘λ˜κ³  잘 λ³Έ λŠλ‚Œμ΄μ—ˆλ‹€.

λ°˜μ„±#

κ²°κ³ΌλŠ” Lv.6. μ•„λ¬΄νŠΌ ν•„μš”ν•œ μš”κ΅¬μ‘°κ±΄μ€ λ§Œμ‘±μ‹œμΌ°μ§€λ§Œ λ‚˜λ¦„ Lv.7을 λ°”λž˜μ„œ κ·ΈλŸ°μ§€ 쑰금 μ‹€λ§μŠ€λŸ¬μ› λ‹€. ν•˜μ§€λ§Œ κ²°κ΅­ μ•ˆμΌν•˜κ²Œ μƒˆμš΄ λͺ©ν‘œμ— λ‹Ήμ—°ν•œ κ²°κ³Όμ˜€λ˜ 것 κ°™κ³ , μ‹œν—˜μ„ 잘 λ΄μ•Όν•˜λŠ” 이유 μžμ²΄κ°€ λΆˆλΆ„λͺ…ν–ˆλ˜ 것 κ°™λ‹€.

μ•„λ¬΄νŠΌ μ—¬κΈ°κΉŒμ§€ TIL을 3μ£Όκ°„ κ²Œμ„λ¦¬ν•œ λ³€λͺ…이닀.

JavaScript#

λ“œλ””μ–΄ HTML, CSSλ₯Ό 끝내고 JavaScript둜 λ„˜μ–΄μ™”λ‹€. Markup Language만 ν•˜λ‹€κ°€ μ˜€λžœλ§Œμ— ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό κ³΅λΆ€ν•˜λ‹ˆ 였히렀 μž¬λ―Έμžˆμ—ˆλ‹€. HTML, CSSλŠ” 속성 역할을 μˆ™μ§€ν•˜κ³ , μ‚¬μš©λ²•μ„ μ΅νžˆλŠ” μˆ˜μ€€μ΄λΌ ν₯λ―Έκ°€ λ–¨μ–΄μ‘Œκ³ , JSλ₯Ό λ‹€λ£° 쀄 μ•Œμ•„μ•Ό μ˜λ―ΈμžˆλŠ” ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•΄λ³Ό 수 μžˆκ² λ‹€ μ‹Άμ–΄ JSλ₯Ό 빨리 κ³΅λΆ€ν•˜λ €κ³  ν•œλ‹€.

기초적인 문법#

ν”„λ‘ νŠΈμ—”λ“œ μ›Ήκ°œλ°œ νŒ¨ν‚€μ§€ κ°•μ’Œλ₯Ό 톡해 기초적인 JS 문법을 λ°°μ› λ‹€. 일반적인 ν”„λ‘œκ·Έλž˜λ° 언어와 μœ μ‚¬ν•œ 뢀뢄은 μ§€λ‚˜κ°€κ³ , μœ μ˜ν•΄μ•Όκ² λ‹€κ³  λ°œκ²¬ν•œ λΆ€λΆ„λ§Œ μ •λ¦¬ν•œλ‹€.

MISC#

  • CodeSandbox : javascriptλ₯Ό ν•™μŠ΅ν•˜κΈ° 쒋은 ide

  • μŒλ”°μ˜΄ν‘œ " 와 λ”°μ˜΄ν‘œ ' λŠ” λ‘˜ 쀑 μ•„λ¬΄κ±°λ‚˜ κ°€λŠ₯. (CodeSandboxμ—μ„œλŠ” .prettierrc μ—μ„œ 섀정을 톡해 cmd + s ν•  λ•Œ λ”°μ˜΄ν‘œμ™€ μŒλ”°μ˜΄ν‘œ 쀑 μ„ νƒν•œκ²ƒμœΌλ‘œ λ³€ν™˜μ‹œμΌœμ€€λ‹€.)

  • ; λŠ” μƒλž΅ κ°€λŠ₯. ν•˜μ§€λ§Œ 가독성을 μœ„ν•΄ μΆ”κ°€ν•˜λŠ” 것 ꢌμž₯.

λ³€μˆ˜μ™€ μƒμˆ˜#

JSμ—μ„œλŠ” λ³€μˆ˜, μƒμˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ type λ³„λ‘œ μ„ μ–Έν•˜μ§€ μ•Šκ³  let , const , 그리고 var λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

  • let 은 λ³€μˆ˜, 값을 λ°”κΏ€ 수 μžˆλ‹€. 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό 또 λ‹€μ‹œ μ„ μ–Έν•  수 μ—†λ‹€.

  • const λŠ” μƒμˆ˜, ν•œλ²ˆ μ„€μ •ν•˜λ©΄ 값을 λ°”κΏ€ 수 μ—†λ‹€. immutable

  • var μ—­μ‹œ λ³€μˆ˜. 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό 또 λ‹€μ‹œ μ„ μ–Έν•  수 μžˆλ‹€.

var λŠ” ν˜„μž¬ ꢌμž₯λ˜μ§€ μ•ŠλŠ” λ³€μˆ˜.IE9, IE10 λ“±μ˜ κ΅¬ν˜• λΈŒλΌμš°μ €μ—μ„œλŠ” let , const κ°€ μ—†μ–΄μ„œ μ‚¬μš© λΆˆκ°€ν•˜λ‹€.ν•˜μ§€λ§Œ Babel μ΄λΌλŠ” 도ꡬλ₯Ό 톡해 JS μ½”λ“œκ°€ κ΅¬ν˜• λΈŒλΌμš°μ €μ—μ„œ λŒμ•„κ°€λ„λ‘ ν˜Έν™˜ν•΄μ€„ 수 있기 λ•Œλ¬Έμ— var λ₯Ό μ™„μ „νžˆ μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ°œλ°œν•˜λŠ”κ²ƒμ΄ κ°€λŠ₯ν•˜λ‹€.

이 외에도 var , let , const λŠ” scope μ—μ„œ 차이가 μžˆλ‹€.

  • var λŠ” function-scoped

  • let , const λŠ” block-scoped

μ΄λŠ” hoisting , IIFE 와 관계가 μžˆλŠ”λ°, μ •λ¦¬λœ 링크가 μžˆμ–΄μ„œ 링크둜 첨뢀 λ‚˜μ€‘μ— λ‹€μ‹œ 보고 κ³΅λΆ€ν•˜μž.

πŸ”— var, let, const 차이점은?

Null, undefined#

null : μ—†λŠ” 것.

undefined : 값이 아직 μ„€μ •λ˜μ§€ μ•ŠμŒ

var variable;console.log(variable); // undefined

비ꡐ μ—°μ‚°μž#

λ‹€λ₯Έ PLκ³Ό 달리 == , === 두 κ°€μ§€μ˜ μΌμΉ˜μ—°μ‚°μžκ°€ μžˆλŠ”λ°,

== : νƒ€μž…μ„ κ²€μ‚¬ν•˜μ§€ μ•ŠμŒ (숫자 2와 문자 '2'κ°€ 동일)

=== : νƒ€μž…μ„ 검사함.

ν•¨μˆ˜#

ν•¨μˆ˜λŠ” 였늘 κ³΅λΆ€ν•œ λ‚΄μš© 쀑 κ°€μž₯ μ€‘μš”ν•œ λ‚΄μš©μ΄λ‹€. λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ ν•¨μˆ˜λ₯Ό 닀뀄본 적이 μžˆμ§€λ§Œ, ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³Έλ‹€.

일반적으둜, ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ™ΈλΆ€ (λ˜λŠ” μž¬κ·€(recursion)의 κ²½μš°μ—” λ‚΄λΆ€) μ½”λ“œμ— μ˜ν•΄ν˜ΈμΆœλ  수 μžˆλŠ” "ν•˜μœ„ν”„λ‘œκ·Έλž¨"μž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ κ·Έ 자체처럼, ν•¨μˆ˜λŠ” ν•¨μˆ˜ λͺΈν†΅ (function body)이라고 ν•˜λŠ” 일련의 ꡬ문(statement)으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. 값은 ν•¨μˆ˜μ—μ „λ‹¬λ  수 있고 ν•¨μˆ˜λŠ” 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. - MDN web docs - ν•¨μˆ˜

JavaScriptμ—μ„œμ˜ ν•¨μˆ˜μ˜ νŠΉμ§•μ€ 이렇닀고 ν•œλ‹€.

JavaScriptμ—μ„œ, ν•¨μˆ˜λŠ” λ‹€λ₯Έ 객체처럼 속성 및 λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆκΈ°μ— 일급 (first-class) κ°μ²΄μž…λ‹ˆλ‹€. λ‹€λ₯Έ 객체와 ν•¨μˆ˜λ₯Ό κ΅¬λ³„ν•˜λŠ” 것은 ν•¨μˆ˜λŠ” 호좜될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ°„λ‹¨νžˆ 말해, ν•¨μˆ˜λŠ” Function κ°μ²΄μž…λ‹ˆλ‹€. - MDN web docs - ν•¨μˆ˜

ν•¨μˆ˜λŠ” λ°˜ν™˜ 값을 μ§€μ •ν•˜λŠ” return 문이 μžˆμ–΄μ•Ό ν•˜λŠ”λ°, return 문이 μ—†λ‹€λ©΄ ν•¨μˆ˜λŠ” 기본값을 λ°˜ν™˜ν•œλ‹€. κΈ°λ³Έ λ°˜ν™˜κ°’μ€ undefined 이닀.

ν•¨μˆ˜ μ •μ˜#

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” μ—¬λŸ¬ 방법이 μžˆλŠ”λ°.

  • ν•¨μˆ˜ μ„ μ–Έ

  • ν•¨μˆ˜ ν‘œν˜„μ‹(expression)

  • Function μƒμ„±μž

λ¨Όμ € ν•¨μˆ˜ 선언은 이렇닀.

function name([param[, param[, ... param]]]) {   statements}

ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œ 이후에 μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— name 이 ν•„μˆ˜μ μ΄κ³ , param 은 ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 인수의 μ΄λ¦„μœΌλ‘œ 255κ°œκΉŒμ§€ κ°€λŠ₯ν•˜λ‹€. statements λŠ” ν•¨μˆ˜μ˜ λͺΈν†΅μ„ κ΅¬μ„±ν•œλ‹€.

λ‹€μŒμœΌλ‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λ‹€.

ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν•¨μˆ˜ μ„ μ–Έκ³Ό λΉ„μŠ·ν•˜κ³  ꡬ문이 같은데, 차이점은 λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•œλ‹€λŠ” 것이닀.

var myFunction = function [name]([param[, param[, ... param]]]) {   statements}

이 λ•ŒλŠ” name 을 μƒλž΅ν•˜κ³ , 읡λͺ…(anonymous) ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  수 있고, name 을 λ„£μ–΄μ„œ named 둜 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

읡λͺ… ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  λ•Œ λ³€μˆ˜λͺ…(μœ„μ—μ„  myFunction )을 ν•¨μˆ˜μ˜ μ΄λ¦„μœΌλ‘œ μƒκ°ν•˜λ©΄ μ•ˆλ˜λŠ”λ°, ν•¨μˆ˜μ˜ 참쑰값이 myFunction μ΄λΌλŠ” λ³€μˆ˜μ— μ €μž₯된 것이닀.

μ–΄λ””κΉŒμ§€λ‚˜ '읡λͺ…' ν•¨μˆ˜μ΄κ³ , ν•¨μˆ˜ λ³€μˆ˜μΈ myFunction 을 톡해 호좜 ν•˜λŠ” 것이닀.

λ˜ν•œ named ν•¨μˆ˜μ˜ κ²½μš°μ— ν•¨μˆ˜ λ³€μˆ˜μΈ myFunction 으둜 μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ, ν•¨μˆ˜ 이름 name μœΌλ‘œλŠ” ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ ν˜ΈμΆœν•  수 있고 μ™ΈλΆ€μ—μ„œλŠ” ν˜ΈμΆœν•  μˆ˜μ—†λ‹€.

Function μƒμ„±μžλŠ” 잘 μ‚¬μš©λ˜μ§€ μ•Šκ³  ꢌμž₯λ˜μ§€λ„ μ•ŠλŠ” 방식인데, ꡳ이 μ•Œμ•„λ³΄μžλ©΄,

var myFunction = new Function(arg1, arg2, ...argN, functionBody);
var myFunction = new Function('a', 'b', 'console.log(a+b)');myFunction(1, 3); // 4

μ΄λ ‡κ²Œ μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.

ν•¨μˆ˜ μ„ μ–Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ μ€‘μš”ν•œ μ°¨μ΄λŠ” ν˜Έμ΄μŠ€νŒ…(hoisting)이닀. ν•œκ΅­μ–΄λ‘œλŠ” 'λŒμ–΄μ˜¬λ¦Ό'을 λœ»ν•œλ‹€.

인터프린터가 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό 해석함에 μžˆμ–΄μ„œ Global μ˜μ—­μ˜ μ„ μ–Έλœ μ½”λ“œλΈ”λŸ­μ„ μ΅œμƒμ˜ Scope둜 λŒμ–΄μ˜¬λ¦¬λŠ” 것을 ν˜Έμ΄μŠ€νŒ…μ΄λΌ ν•œλ‹€. - Function Declarations(ν•¨μˆ˜μ„ μ–Έ) vs Function Expressions(ν•¨μˆ˜ν‘œν˜„)μ—μ„œ

λ‹¨μˆœν•˜κ²Œ μƒκ°ν•΄μ„œ 선언문은 항상 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진 κ΅¬λ™μ‹œ μ΅œμš°μ„ μ μœΌλ‘œ ν•΄μ„λœλ‹€. ν•˜μ§€λ§Œ 할당은 hoisting이 λ˜μ§€ μ•ŠλŠ”λ‹€.

// 예제 1 : ν•¨μˆ˜μ„ μ–Έμ—μ„œμ˜ ν˜Έμ΄μŠ€νŒ…foo();function foo() {    console.log('hello');};> hello
// 예제 2 : ν•¨μˆ˜ν‘œν˜„μ—μ„œμ˜ ν˜Έμ΄μŠ€νŒ…bar();var bar = function() {    console.log('hello');};> TypeError: bar is not a function

예제 좜처 : Function Declarations(ν•¨μˆ˜μ„ μ–Έ) vs Function Expressions(ν•¨μˆ˜ν‘œν˜„)

예제1처럼 ν•¨μˆ˜ μ„ μ–Έμ˜ κ²½μš°λŠ” 선언문이 hoisting λ˜μ–΄ μ΅œμƒμ˜ scope둜 λŒμ–΄μ˜¬λ €μ‘ŒκΈ°λ•Œλ¬Έμ— ν•¨μˆ˜ 이름인 foo(); 둜 호좜이 κ°€λŠ₯ν•˜λ‹€.

ν•˜μ§€λ§Œ 예제 2의 κ²½μš°λŠ” ν•¨μˆ˜ ν‘œν˜„μœΌλ‘œ λ˜μ–΄μžˆκ³ , λ”°λΌμ„œ hoistingλ˜λŠ” 뢀뢄은 선언뢀뢄인 var bar; 뿐이닀. λ”°λΌμ„œ bar(); 둜 ν˜ΈμΆœν–ˆμ„ λ•ŒλŠ” bar λŠ” 단지 λ³€μˆ˜μΌλΏμ΄λΌμ„œ TypeError: bar is not a function 의 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

이외에 IIFE , Closure λ“±μ˜ κ°œλ…μ΄ μ—°κ΄€λœ κ²ƒκΉŒμ§€ ν™•μΈν•˜μ˜€λŠ”λ°, μ΄λŠ” λ‹€μŒμ— μ•Œμ•„λ³΄λŠ” κ²ƒμœΌλ‘œ λ§ˆμΉœλ‹€.

Reference#

πŸ”— MDN web docs - ν•¨μˆ˜

πŸ”— Function Declarations(ν•¨μˆ˜μ„ μ–Έ) vs Function Expressions(ν•¨μˆ˜ν‘œν˜„)

πŸ”— ν•¨μˆ˜ ν‘œν˜„μ‹ vs ν•¨μˆ˜ 선언식

πŸ”— Javascript IIFE μ΄ν•΄ν•˜κΈ°

πŸ”— var, let, const 차이점은?

πŸ”— [JS] ν•¨μˆ˜ 생성 방법: ν•¨μˆ˜ ν‘œν˜„μ‹, ν•¨μˆ˜ μ„ μ–Έ, Hoisting