μμ μλ£νμ λ¬Έμμ΄, μ«μμ΄, λΆλ¦¬μΈνμ
, null, undefined μ λ³μ μ μΈμΌλ‘ μ΄λ¦ν λΆμΈ μ€νμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λ³μ νΈμΆλ‘ μ€νμ μ μ₯λμ΄ μλ λ°μ΄ν°λ₯Ό λΆλ¬μ€λ μλ£νλ€μ λ§νλ€.
μ€νμ λ°μ΄ν°λ₯Ό μ§μ μ μ₯νκΈ°μ ν μ€νλΉ μ¦ ν λ³μλΉ νλμ λ°μ΄ν°λ§ μ μ₯ κ°λ₯νλ€.
μ€νμ΄ μλ Heapμ΄λΌλ λ³λ 곡κ°μ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λ³μ μ μΈμΌλ‘ μ΄λ¦ λΆν μ€νμλ ν΄λΉ λ°μ΄ν°μ μ£Όμλ§ μ μ₯λλ€.
λ³μλ₯Ό νΈμΆν΄ μ€νμμ λ°μμ€λ κ²μ΄ λ°μ΄ν°κ° μλ Heapμ μλ λ°μ΄ν°μ μ£Όμμ΄κΈ° λλ¬Έμ μ°Έμ‘°νλ€κ³ ν΄μ μ°Έμ‘° μλ£νμ΄λ€.
μ°Έμ‘° μλ£νμλ λ°°μ΄κ³Ό κ°μ²΄κ° μλ€.
μ΄ λ μλ£νμ κ°μ₯ ν° μ°¨μ΄κ° μμ μλ£νμ κ²½μ° μ μΈλκ³ κ°μ΄ ν λΉλμ΄ μλ λ³μ(x)λ₯Ό λ€λ₯Έ λ³μ(y)μ ν λΉνλ©΄ ν΄λΉ μ€νμ λ°μ΄ν°κ° 볡μ λμ΄ μλ‘μ΄ λ³μ(y)μ μ€νμ ν λΉλλ€.
κ·Έλ κΈ°μ ν λΉνκ³ λμλ μλ‘μ΄ λ³μ(y)λ₯Ό μμ νλ€κ³ ν΄λ κΈ°μ‘΄ λ³μ(x)μλ μν₯μ΄ μ ν μλ€.
κΈ°μ‘΄ μ€νμ κ·Έλλ‘ λκ³ μλ‘ λ³΅μ ν μ€νμ μλ λ°μ΄ν°λ₯Ό μ§μ§κ³ λ³Άλ κ²μ΄κΈ° λλ¬Έμ΄λ€.
let x = 10; let y = x; if(true){ y++ }; console.log(x) // 10; console.log(y) // 11; 볡μ ν yμ κ°μ΄ λ³ν΄λ xμ κ°μ λ³νμ§ μλλ€.
κ·Έλ°λ° μ°Έμ‘° μλ£ν κ°μ κ²½μ°λ λ°μ΄ν° μ체λ₯Ό 볡μ νλ κ²μ΄ μλ λ°μ΄ν°μ μ£Όμλ§ λ³΅μ νκΈ° λλ¬Έμ μλ‘μ΄ λ³μ(y)λ₯Ό μμ νλ©΄ κΈ°μ‘΄ λ³μ(x)μ μΆλ ₯ κ°μλ μμ μ΄ λ°μλλ€. ( μ μ΄μ κ°μ κ°μ κ°μ§κ³ μΆλ ₯νλ κ²μ΄λ )
let x = { name: 'sunghoon', }; let y = x; if(1){ y.name = 'planet'; } console.log(x) // { name : 'planet' }; yκ°μ΄ λ°λλ xκ°λ λ°λμλ€. console.log(y) // { name : 'planet' };
μ€μ½νμ λ²μλ μ€κ΄νΈ(λΈλ‘) λλ ν¨μμ μν΄ λλκ³ λ°κΉ₯μͺ½ μ€μ½νμμ μ μΈν λ³μλ μμͺ½ μ€μ½νμμ νμ©κ°λ₯νλ μμͺ½ μ€μ½νμμ μ μΈν λ³μλ λ°κΉ₯μͺ½ μ€μ½νμμ νΈμΆν μ μλ€. ( var
λ μμΈ κ²½μ°κ° μμ. )
λ°κΉ₯μͺ½κ³Ό μμͺ½μ μ΄μΌκΈ°ν λ λμΉμ±κ² μ§λ§, μ€μ½νλ μ€μ²©μ΄ κ°λ₯νλ€.
κ°μ₯ μΈκ°μ μ€μ½νλ₯Ό μ μ μ€μ½ν(Global scope)λΌκ³ νκ³ μμ μ€μ½νκ° μ‘΄μ¬νλ λͺ¨λ μ€μ½νλ€μ μ§μ μ€μ½ν(Local scope)λΌκ³ νλ€.
μ μ μ€μ½νλ μ½λ μ΄λμλ μ°Έκ³ κ° κ°λ₯νλ μ§μ μ€μ½νκ°μ κ²½μ°λ ν¨μλΈλ‘ μ체λ κ·Έ νμμ μ½λ λΈλ‘μμλ§ μ°Έμ‘°κ°λ₯νλ€.
μ΄μ κ°μ νΉμ§ λμ μ μμ μ μΈλμ΄ μλ λ³μλ₯Ό μ§μμμ λ€μ μ μΈνκ³ μ¬μ© ν μ μλλ° μ΄ κ°μ νΉμ§μ μλμ(Variable Shadowing)μ΄λΌκ³ νλ€.
κ°μ λ³μλ₯Ό μ¬λ¬λ² μ μΈ ν μμλ λ§νΌ λ³μ λͺ μ΄ κ²ΉμΉλ©΄ μ€μ²©λ μ€μ½νμμλ μ΄λ λ³μκ° μ°Έμ‘°λλμ§ ν·κ°λ¦΄ μ μλλ°, μ§μ μ€μ½ν κ°μ κ²½μ°λ μ μ μ€μ½ν λ³΄λ€ μ°μ μμκ° λμΌλ©° μ€μ²© μ€μ½νκ°μ κ²½μ°μλ μΈμ ν λΈλ‘μ μ°μ ν΄μ μ°Έμ‘°νλ€.
let x = 10; function func(){ let x = 20; function func1(x) { x = x + 10; // μ¬κΈ°μ μ μμ μ μΈλ xλ₯Ό μ°Έμ‘°νλκ² μλ λ°λ‘ μμ λΈλ‘μ μ μΈν x = 20μ μ°Έμ‘°νλ€. } return func1() } console.log(x) // 10; ν¨μ μμμ μ§μ§κ³ λ³Άλ λ§λ μ§μμμ μ μΈλ λ³μλ μ§μ λ°μΌλ‘ λμ€μ§ λͺ»νλ€.
μ€μ½νλ μ€κ΄νΈλ‘ λλλ λΈλ‘ μ€μ½νμ ν¨μλ‘ λλ¬μΌ λ²μμΈ ν¨μ μ€μ½νκ° μλ€.
νμ΄ν ν¨μλ μ 맀ν λ©΄μ΄ μμΌλ λΈλ‘ μ€μ½νμ ν¨μ μ€μ½ν μ¬μ΄ κ·Έ μ΄λκ°μ μλ€κ³ μΉμ.
λΈλ‘ μ€μ½νμμ μ μΈν λ³μλ λΈλ‘μ λ²μ΄λλ μκ° μ¬μ©ν μ μλ€.
λ¨ μκΉλΆν° μΈκΈ μ€μΈ μ΄ var
λ‘ μ μΈν λ³μλ ν¨μ μ€μ½νλ§ λ°λ₯΄κ³ λΈλ‘ μ€μ½νλ 무μνλ©΄μ μ¬μ§μ΄ κ°μ μ€μ½ν λ΄μμ μ¬μ μΈλ ν μ μλ μμ£Ό κ·Όλ³Έ μκ³ λͺ»λλ¨Ήμ λμ΄λ€.
μ΄λ¬ν νΉμ± λλ¬Έμ μ΅κ·Όμλ var
μ¬μ©μ μ§μλκ³ μ£Όλ‘ const
λ let
μΌλ‘ λ³μλ₯Ό μ μΈνλ€.
const
μ let
λ λͺ¨λ ν¨μ μ€μ½νμ λΈλ‘ μ€μ½νλ₯Ό λ°λ₯΄λ©° μ¬μ μΈμ΄ λΆκ°λ₯νλ€λ μ μ κ°μ§λ§, const
λ μ¬ν λΉλ μλλ ν€μλλΌλ μ°¨μ΄κ° μλ€. κ³ λ‘ κ°μ΄ κ³ μ λμ΄ μλ λ³μλ const
λ₯Ό μ¬μ©νκ³ , μ¬ν λΉμ΄ νμν λ³μλ let
μ μ¬μ©νλ€.
λΈλΌμ°μ μμ var
λ ν¨μ λ°μμ μ μΈλ λ μ μ κ°μ²΄(window)μ νλ‘νΌν°κ° λλ€.
μ μ λ³μλ₯Ό λ§μ΄μ°λ©΄ μλμΉ μμ λΆμν¨κ³Ό(side-effect)κ° λ°μν κ°λ₯μ±μ΄ 컀μ§λ―λ‘ μ μ λ³μλ μ§μνλκ² μ’λ€.
μ μΈμμ΄ λΈλ‘ μ€μ½ν λ΄μμ λ³μλ₯Ό ν λΉνκ² λλ©΄ μ μκ°μ²΄μ νλ‘νΌν°κ° λλ©΄μ μ μμμ μ°Έμ‘°ν μ μκ² λλ€. μ¦ var
λ‘ μ μΈν κ²κ³Ό μ μ¬ν μ·¨κΈμ λ°κ² λλ€.
μ΄λ₯Ό μμ νλ €λ©΄ delete window.λ³μλͺ
λ©μλ
λ₯Ό μ¬μ©νλ©΄ λλ€.
let x = 10; if(1) { y = 20 } console.log(y) // 20; λΈλ‘ μ€μ½ν λ°μΌλ‘ λͺ»λμ€λκ² λ§μ§λ§ μ μΈμμ΄ ν λΉμ ν΄λ²λ € μ μκ°μ²΄μ νλ‘νΌν°κ° λμ΄λ²λ Έλ€.
ν΄λ‘μ ν¨μμ μ μλ ν¨μμ ν¨μκ° μ μΈλ μ΄νμ νκ²½(lexical environment)μ μ‘°ν©μ λ§νλ€. μ΄ νκ²½μ ν΄λ‘μ κ° μμ±λ μμ μ μ ν¨ λ²μ λ΄μ μλ λͺ¨λ μ§μ λ³μλ‘ κ΅¬μ±λλ€.
μ΄λ€.
μ΄νμ νκ²½μ λ³μ λ° ν¨μ μ μΈμ νν μ λλ‘λ§ κΈ°μ΅ν΄λμ.
λ§μ΄ μ΄λ €μ΄λ° μ‘°κΈ νμ΄μ°μλ©΄ 리ν΄λ λ΄λΆν¨μ(ν΄λ‘μ ν¨μ)κ° λ΄λΆν¨μλ₯Ό κ°μΈκ³ μλ μΈλΆν¨μμ μ€νμ΄ μ’
λ£λ ν μΈλΆμμ νΈμΆλμ΄λ κ·Έ ν¨μκ° λ¦¬ν΄λλ©° μ μΈλμμ λΉμ νκ²½μ κΈ°μ΅ν΄ κ·Έ νκ²½μ μ κ·Ό ν μ μκ² ν΄μ£Όλ κ²μ΄λ€.
λκ°μ΄ 머리μνλ€
μ‘°κΈ λ κ°λ¨νκ² νμλ©΄ μΈλΆ ν¨μμ μ κ·Ό ν μ μλ λ΄λΆ ν¨μμ λλ‘λ§ κΈ°μ΅ν΄λμ.
ν΄λ‘μ ν¨μλ ν¨μκ° λ΄λΆμ μΈλΆλ‘ λλμ΄ μκ³ μ΄λ₯Ό λ΄λΆ ν¨μ, μΈλΆ ν¨μλΌκ³ νλ€.
μ΄ μμ λ€λ₯Έ μ€μ½νλ€κ³Ό κ°μ΄ μΈλΆ ν¨μμμ λ΄λΆ ν¨μμμ μ μΈν λ³μμ μ κ·Ό λΆκ°λ₯νλ©°,
λ°λλ‘ λ΄λΆ ν¨μμμ μΈλΆ ν¨μμμ μ μΈν λ³μμ μ κ·Ό κ°λ₯νλ€.
function outer(x){ y += 1 return function inner(y){ x += 1 } } //outerμ μ€μ½νμ innerμ 맀κ°λ³μμ 1 λνλ€λ κ² μ νμλ€. //μ΄λ° μμΌλ‘ μΈλΆ ν¨μμμ λ΄λΆ ν¨μμμ μ μΈλ λ³μλ‘μ μ°Έμ‘°λ λΆκ°νλ€.
μλ ν¨μμ 맀κ°λ³μ κ°κΉμ§ μ§μ ν΄μ νΈμΆνλ κ²μ λ³μμ§μ μ΄ λμ§ μκ³ , μΌλ°μ μΈ ν¨μλ ν¨μμ€νμ΄ λλλ©΄ ν¨μ λ΄λΆμ μ κ·Όν μ μμ§λ§, ν΄λ‘μ ν¨μμ κ²½μ° μ΄νμ νκ²½μ λ©λͺ¨λ¦¬μ μ μ₯νκΈ°μ μΈλΆ ν¨μ λ΄ λ³μκ° λ©λͺ¨λ¦¬ μμ μ μ₯λλ€.
ν΄λ‘μ ν¨μλ μΈλΆ ν¨μ λ΄ λ³μκ° λ©λͺ¨λ¦¬ μμ μ μ₯λκΈ°μ μΈλΆμμ λ³μμ μ κ·Όνμ§ λͺ»νκ² νκ³ λͺκ°μ§ μ ν΄λ ν¨ν΄μΌλ‘ ν¨μλ₯Ό νΈμΆν¨μΌλ‘ λ΄λΆμ μλ λ°μ΄ν°λ₯Ό λ³κ²½μν€λ λ°©λ²μ΄ ν΄λ‘μ λͺ¨λ ν¨ν΄μ΄λ€.
ν¨μμ λ¦¬ν΄ κ°μ κ°μ²΄λ‘ μ νκ³ κ°μ²΄μ νλ‘νΌν° λ°Έλ₯μ ν¨μλ₯Ό ν λΉνλ©΄μ κ·Έκ±Έ μλμν¬ νλ‘νΌν° ν€λ₯Ό μ€μ νλ κ²μ΄λ€.
const makeCounter = () => { let count = 0; return { increase: () => count++, decrease: () => count--, getCount: () => count, } } let counter1 = makeCounter(); counter1.increase(); counter1.increase(); counter1.increase(); counter1.getCount(); // 3; let counter2 = makeCounter(); counter2.decrease(); counter2.decrease(); counter2.decrease(); counter2.getCount(); //-3; //μ΄νμ νκ²½μ μ μ₯νλ νΉμ± λμ μΈλΆ ν¨μλ₯Ό λ€λ₯Έ λ³μμ μ§μ νλ©΄, //κ°μ ν¨μλ‘ μ¬λ¬ κ°μ κ°μ§κ² ν μ μλ€.
μμ μλ£νκ³Ό μ°Έμ‘° μλ£νμ μ°¨μ΄λ₯Ό λ³΄λ€ νμ€ν νλ€.
μ€μ½ν κ°λ
μ λͺ
νν νκ³ , ν΄λ‘μ κ°λ
μ λ°°μ λ€.
μ€λμ μκ°μ΄ λΆμ‘±νμ§ μμλ€.
μμ λ€λ₯Έ 곡λΆλ₯Ό λͺ»νκ² λ§μμ κ±Έλ¦°λ€.
μ€λμ νμ΄κ° μλ μ±ν°λ‘ κ°λν λ§μ§λ§ λ μ΄λ€.
μλ§ μ€λμ²λΌ μ±ν°μκ°μ μ¬μ λ‘κ² κ°μ§λ©° 곡λΆνλ λ μ μμΌλ‘ μκ² μ§.
μ μ μͺΌμΌκ³ μ λλ‘ λ¬λ €λ³΄μ!