#
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 λ¬Έλ²μ λ°°μ λ€. μΌλ°μ μΈ νλ‘κ·Έλλ° μΈμ΄μ μ μ¬ν λΆλΆμ μ§λκ°κ³ , μ μν΄μΌκ² λ€κ³ λ°κ²¬ν λΆλΆλ§ μ 리νλ€.
#
MISCCodeSandbox : 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, undefinednull
: μλ κ².
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π Function Declarations(ν¨μμ μΈ) vs Function Expressions(ν¨μνν)
π ν¨μ ννμ vs ν¨μ μ μΈμ
π Javascript IIFE μ΄ν΄νκΈ°
π var, let, const μ°¨μ΄μ μ?
π [JS] ν¨μ μμ± λ°©λ²: ν¨μ ννμ, ν¨μ μ μΈ, Hoisting