π let, const, var, function μ€νμ리
π 1. let, const, var
βΆοΈ var,let,const λ₯Ό ꡬλΆνλ κ°μ₯ μ€μν μ μ μμ½νλ©΄
π 1-1. κ° λ³κ²½ κ°λ₯ μ 무
π 1-2. ν¨μμ€μ½ν vs λΈλ‘μ€μ½ν
varμ ν¨μμ€μ½ν
letκ³Ό const λ³μλ λΈλ‘ μ€μ½ν
π 1-3. νΈμ΄μ€ν κ°λ₯ μ 무
varμ νΈμ΄μ€ν κ°λ₯,
letκ³Ό constλ νΈμ΄μ€ν λΆκ°λ₯
μ΄λ κ² ifλ¬Έμ κ°μΈκ³ μλ {λΈλ½} μ΄ λ³μλ₯Ό μ¬μ©ν μ μλ μμμ΄ λμ΄ λ³μκ° κ΅¬λΆλμ΄ μ§λ€.
μμ κ°μ΄ letμ μ°λ©΄ ifμκ³Ό λ°μΌλ‘ μ€μ½νκ° λ¬λΌμ§μ§λ§ (λΈλ‘ μκ³Ό λ°μ μ€μ½νκ° λ¬λΌμ Έμ λ³μ μ΄λ¦μ΄ κ°μλ κ°μ΄ λ체λμ§ μμ κ°μ μ€μ½νμλ κ°μ μ΄λ¦ μ¬μ© λΆκ°νλ€),
nameμ varλ³μλ‘ μ μΈ νμ κ²½μ°μλ if μκ³Ό λ°μ΄ κ°μ μ€μ½νκ° λμ΄μ "Uncaught SyntaxError: Identifier 'name' has already been declared"μ€λ₯κ° λ¨κ²λ¨
π 2. function()μ μ리
βΆοΈ μμ§μ΄ ν¨μλ₯Ό μ€ννλ λ°©λ²
ν¨μλ₯Ό μ€ννκΈ° μν΄μλ μ΄λ¦(μλ³μ)μ΄ νμν©λλ€. μ΄λ¦μ΄ μμ΄μΌ μ€μ½νμμ κ°μ μ°Έμ‘°ν μ μκΈ° λλ¬Έμ λλ€.
==> <ν¨μλ₯Ό μ€ννλ νλ¦>
μμ§μ΄ ν¨μ μ μΈλ¬Έμ λ§λλ©΄ μλ³μλ₯Ό κ΄λ¦¬νλ νΉλ³ν μ§ν©(EnviromentRecord)μ ν¨μμ μ΄λ¦μ μλ³μλ‘ λ£κ³ ν¨μ κ°μ²΄λ₯Ό μμ±νμ¬ μ°Έμ‘°ν©λλ€. κ·Έλ¦¬κ³ ν¨μ μ€ν ꡬ문 μ€ fooλ₯Ό λ§λλ©΄ κ°μ μ€μ½νλ₯Ό ν΅ν΄ κ°μ Έμ΅λλ€. κ·Έ λ€μ κ΅¬λ¬Έμ΄ () μ΄λ―λ‘ μ€ν κ°λ₯νλ€λ©΄ μ€νν©λλ€.
λ§μ½ μ€μ½νμμ μλ³μλ₯Ό μ°Ύμ§ λͺ»νλ€λ©΄ μ°Έμ‘° μλ¬(ReferenceError)λ₯Ό μΆλ ₯νκ³ , μλ³μλ μ°Ύμμ§λ§ μ€νν μ μλ νμ μ΄λΌλ©΄ νμ μλ¬(TypeError)λ₯Ό μΆλ ₯ν©λλ€.
βΆοΈ μ΅λͺ ν¨μλ₯Ό μ μΈνλ λ°©λ²
κ²°κ΅ +function(){}()μ μ΅λͺ ν¨μλ₯Ό μ¦μ μ€νμν€κΈ° μν΄ μμ§μ μ리λ₯Ό μ΄μ©ν΄ λ§λ νΈλ²μ λλ€.
μ΄ μ리λ₯Ό μ΄μ©ν μ¦μ μ€ν ν¨μ μ€ κ°μ₯ λμ€μ μΈ λ°©μμ (function(){})()μ λλ€. ()λ ꡬ문 νκ°λ₯Ό νλλ° νκ°λ κ²°κ³Όκ° ν¨μμ΄λ ν¨μ κ°μ²΄λ₯Ό λ§λ€κ³ μ΄μ΄μ () ꡬ문μΌλ‘ μ¦μ μ€ννλ λ°©μμ λλ€.
λ¨μ΄ μ½μλ νΌλμ€λ½μ§ μμμΌ μ’μ μ½λλΌκ³ ν μ μκ² μ£ . λ°λΌμ λΉλμ€μ μΈ +function(){}() λ³΄λ€ (function(){})() μ¬μ©νμ¬ μ½λλ₯Ό μ½λ κ°λ°μκ° μ¦μ μ€ννλ ν¨μ μμ μ½κ² μ μ μλλ‘ νλνΈμ΄ μ’κ² μ΅λλ€.
μλ°μ€ν¬λ¦½νΈλ κ΅¬λ¬Έμ΄ μ μ°νκΈ° λλ¬Έμ μμ λ§μ κ·μΉμ΄λ λ²μΉμ λ§λ€κΈ° μ½μ΅λλ€. νμ§λ§ μ΄λ νμ μ λ μ΄ λ μ μμμ λͺ μ¬ν΄μΌν©λλ€.