JS Variable
Table of contents
μλ°μ€ν¬λ¦½νΈμ λ³μ(Variable)
λ³μ(Variable)λ νλμ κ°μ μ μ₯νκΈ° μν΄ ν보ν λ©λͺ¨λ¦¬ κ³΅κ° μ체 λλ κ·Έ λ©λͺ¨λ¦¬ 곡κ°μ μλ³νκΈ° μν΄ κ³ μ μ μ΄λ¦μΈ μλ³μ(identifier)λ₯Ό λͺ μν κ²μ΄λ€.
νλ‘κ·Έλ¨μμ μ¬μ©λλ λ°μ΄ν°λ₯Ό μΌμ κΈ°κ° λμ κΈ°μ΅νμ¬ νμν λμ λ€μ μ¬μ©νκΈ° μν΄ κ°μ μ μ₯νκ³ μ°Έμ‘°νλ λ©μ»€λμ¦μΌλ‘ κ°μ μμΉλ₯Ό κ°λ¦¬ν€λ μμ§μ μΈ μ΄λ¦μ΄λ€.
λ³μλͺ
λ³μμ λͺ μν κ³ μ ν μλ³μ
λ³μκ°
λ³μλ‘ μ°Έμ‘°ν μ μλ λ°μ΄ν°
μλ³μ(identifier)
μ΄λ€ κ°μ΄λ λμμ μ μΌνκ² μλ³ν μ μλ κ³ μ ν μ΄λ¦μ λ§νλ€.
λ³μλͺ , ν¨μλͺ , νλ‘νΌν°λͺ (νλ‘νΌν° ν€), ν΄λμ€λͺ λ±μ΄ μλ€.
κ°μ λ©λͺ¨λ¦¬ 곡κ°μ μ μ₯λμ΄ μκ³ , μλ³μλ λ©λͺ¨λ¦¬ 곡κ°μ μ μ₯λμ΄ μλ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κΈ°μ΅νμ¬ νΉμ κ°μ λΆλ³νκ³ μλ³ν μ μλ€.
νλ§λλ‘ μλ³μλ κ°μ΄ μλλΌ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κΈ°μ΅(μ μ₯)νκ³ μλ€.
λ³μ μ μΈ(Variable declaration)
λ³μλ₯Ό μμ±νλ κ²μ λ§νλ€. κ°μ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ ν보(allocate, ν λΉ)νκ³ λ³μ μ΄λ¦κ³Ό ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμλ₯Ό μ°κ²°(name binding)ν΄μ κ°μ μ μ₯ν μ μκ² νλ€.
λ³μ μ μΈμ μν΄ ν보λ λ©λͺ¨λ¦¬ 곡κ°μ νλ³΄κ° ν΄μ (release)λκΈ° μ΄μ κΉμ§λ λꡬλ ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©ν μ μλλ‘ λ³΄νΈλλ―λ‘ μμ νκ² μ¬μ©ν μ μλ€.
λ³μλ var
, let
, const
ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈ νκ³ ν λΉ μ°μ°μ(=
)λ₯Ό μ¬μ©ν΄ κ°μ ν λΉ νλ€.
κ·Έλ¦¬κ³ μλ³μμΈ λ³μλͺ μ μ¬μ©ν΄ λ³μμ μ μ₯λ κ°μ μ°Έμ‘° νλ€.
// μ μΈvar name;// ν λΉname = 'JiSop';// μ°Έμ‘°console.log(name);
λ³μ μμ± λ¨κ³
μ μΈ λ¨κ³(Declaration phase)
- λ³μ κ°μ²΄(Variable Object)μ λ³μλ₯Ό λ±λ‘νλ€. μ΄ λ³μ κ°μ²΄λ μ€μ½νκ° μ°Έμ‘°νλ λμμ΄ λλ€. (λ³μ μ΄λ¦μ λ±λ‘ν΄μ μλ°μ€ν¬λ¦½νΈ μμ§μ λ³μμ μ‘΄μ¬λ₯Ό μλ¦°λ€)
μ΄κΈ°ν λ¨κ³(Initialization phase)
- λ³μ κ°μ²΄(Variable Object)μ λ±λ‘λ λ³μλ₯Ό λ©λͺ¨λ¦¬μ ν λΉνλ€. μ΄ λ¨κ³μμ λ³μλ undefinedλ‘ μ΄κΈ°νλλ€.
(κ°μ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ ν보νκ³ μ묡μ μΌλ‘
undefined
λ₯Ό ν λΉ)
- λ³μ κ°μ²΄(Variable Object)μ λ±λ‘λ λ³μλ₯Ό λ©λͺ¨λ¦¬μ ν λΉνλ€. μ΄ λ¨κ³μμ λ³μλ undefinedλ‘ μ΄κΈ°νλλ€.
(κ°μ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ ν보νκ³ μ묡μ μΌλ‘
ν λΉ λ¨κ³(Assignment phase)
- undefinedλ‘ μ΄κΈ°νλ λ³μμ μ€μ κ°μ ν λΉνλ€.
var
ν€μλλ₯Ό μ¬μ©ν λ³μ μ μΈμ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λμμ μ§νλκ³ ,
let
, const
ν€μλλ₯Ό μ¬μ©ν λ³μ μ μΈμ μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λΆλ¦¬λμ΄ μ§νλλ€.
var
ν€μλ
ES6 μ΄μ μ λ³μ μ μΈμ νκΈ°μν μ μΌν ν€μλμ΄λ€. μ¬λΌμ§ κ²μ μλλΌ μ¬μ©ν μ μμ§λ§ μ£Όμν μ μ΄ λ§κ³ , μ¬λ¬κ°μ§ λ¬Έμ λ₯Ό κ°μ§κ³ μμ΄ λ μ΄μ μ¬μ©μ κΆμ₯νμ§ μλλ€.
var ν€μλλ‘ μ μΈλ λ³μμ νΉμ§
μ£Όμλ₯Ό κΈ°μΈμ΄μ§ μμΌλ©΄ μ¬κ°ν λ¬Έμ λ₯Ό μΌμΌν¨λ€.
Function-level scopeλ₯Ό κ°μ§κ³ μλ€.
- μλμΉ μκ² μ μ λ³μκ° μ μΈλμ΄ μ¬λ¬κ°μ§ λ¬Έμ λ₯Ό μΌμΌν€κΈ° μ¬μμ§λ€.
- for loop μ΄κΈ°νμμμ μ¬μ©ν λ³μλ₯Ό for loop μΈλΆ λλ μ μμμ μ°Έμ‘°ν μ μλ€.
var ν€μλ μλ΅ νμ©
- λ³μ μ μΈ ν€μλλ₯Ό μ¬μ©νμ§ μμλ λ³μ μ μΈμ΄ κ°λ₯νκ³ ν€μλλ₯Ό μλ΅ν λ³μλ μ묡μ μΌλ‘ var ν€μλλ‘ μ μΈλκΈ° λλ¬Έμ μ μ λ³μκ° λ μ μλ€.
μ€λ³΅ μ μΈνμ©
- var ν€μλλ μ€λ³΅ μ μΈμ νμ©νκΈ° λλ¬Έμ μλνμ§ μμ λ³μκ° λ³κ²½μ΄ μΌμ΄λ μ μλ€.
μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³κ° λμμ μ΄λ£¨μ΄μ§λ€.
- var ν€μλλ‘ μ μΈλ λ³μλ μ μΈκ³Ό λμμ μ΄κΈ°νκ° μ΄λ£¨μ΄ μ§λ©΄μ
undefined
κ°μ΄ ν λΉλλ€.
- var ν€μλλ‘ μ μΈλ λ³μλ μ μΈκ³Ό λμμ μ΄κΈ°νκ° μ΄λ£¨μ΄ μ§λ©΄μ
λ³μλ₯Ό μ μΈνκΈ° μ μ μ°Έμ‘°κ° κ°λ₯νλ€.
- λ³μ νΈμ΄μ€ν μ μν΄ λ³μκ° μ μΈλκΈ° μ μΈ λΌμΈμμλ μ°Έμ‘°κ° κ°λ₯νλ€.
μ μ λ³μμ λ¬Έμ μ
λλΆλΆμ λ¬Έμ λ μ μ λ³μλ‘ μΈν΄ λ°μνκΈ° λλ¬Έμ λΆκ°νΌν μν©μ μ μΈνκ³ μ¬μ©μ μ΅μ ν΄μΌ νλ€.
- μ μ λ³μλ μ ν¨ scopeκ° λμ΄μ μ΄λμμ μ΄λ»κ² μ¬μ©λ κ²μΈμ§ νμ νκΈ° νλ€λ€.
- λΉμμ ν¨μ(Impure function)μ μν΄ μλνμ§ μκ² λ³κ²½λ μλ μμ΄μ 볡μ‘μ±μ μ¦κ°μν€λ μμΈμ΄ λλ€.
λ³μμ μ ν¨ scopeλ μ’μμλ‘ μ’λ€.
let
, const
ν€μλ
var ν€μλμ λ¨μ μ 보μνκΈ° μν΄ ES6 λΆν° let
κ³Ό const
κ° λμ
λμλ€.
let, const ν€μλμ 곡ν΅μ
μ€λ³΅ μ μΈ κΈμ§
- μ΄λ¦μ΄ κ°μ λ³μλ₯Ό μ€λ³΅ν΄μ μ μΈνλ©΄ SyntaxErrorκ° λ°μνλ€.
block-level scope μ§μ
- λͺ¨λ μ½λ λΈλ‘μ μ§μ μ€μ½νλ‘ μΈμ νλ€.
- μ½λ λΈλ‘μΌλ‘λ ν¨μ, if λ¬Έ, for λ¬Έ, while λ¬Έ, try/catch λ¬Έ λ±μ΄ μλ€.
λ³μ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ² μ²λΌ λμνλ€.
μΌμμ μ¬κ°μ§λ(TDZ)κ° μκΈ°λ©΄μ μ μΈλ¬Έ μ΄μ μ μ°Έμ‘°νλ©΄ ReferenceErrorκ° λ°μνλ€.
β οΈ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ² μ²λΌ λμνλ κ²μ΄μ§ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ μλλ€.
μ 격 κ°μ²΄μ νλ‘νΌν°κ° μλλ€.
μΌμμ μ¬κ°μ§λ(Temproal Dead Zone, TDZ)
μ€μ½νμ μμ μ§μ λΆν° μ΄κΈ°ν λ¨κ³ μμ μ§μ (λ³μ μ μΈλ¬Έ)κΉμ§μ λ³μλ₯Ό μ°Έμ‘°ν μ μλ ꡬκ°
'μ μΈ λ¨κ³'μ 'μ΄κΈ°ν λ¨κ³'κ° λΆλ¦¬λμ΄ μ§νλκΈ° λλ¬Έμ΄λ€. μ묡μ μΌλ‘ μ μΈ λ¨κ³κ° λ¨Όμ μ€νλμ§λ§ μ΄κΈ°ν λ¨κ³λ λ³μ μ μΈλ¬Έμ λλ¬νμ λ μ€νλλ€. μ΄κΈ°ν λ¨κ³κ° μ€νλκΈ° μ΄μ μ λ³μμ μ κ·Όνλ €κ³ νλ©΄ μ°Έμ‘° μλ¬(ReferenceError)κ° λ°μνλ€.
let, const ν€μλμ μ°¨μ΄μ
let
- μ¬ν λΉμ΄ κ°λ₯νλ€.
const
μ¬ν λΉμ΄ λΆκ°λ₯νλ€.
- μ¬ν λΉ νλ €κ³ νλ©΄ TypeErrorκ° λ°μνλ€.
μ μΈκ³Ό λμμ μ΄κΈ°νκ° μ΄λ£¨μ΄μ ΈμΌ νλ€.
- μ μΈκ³Ό λμμ μ΄κΈ°ν(κ°μ ν λΉ)λ₯Ό νμ§ μμΌλ©΄ SyntaxErrorκ° λ°μνλ€.
λ³ννμ§ μλ μμ μ μΈ
- const ν€μλλ‘ μ μΈν λ³μκ° λ€ μμκ° λλ κ²μ μλκ³ κ°μ΄ μμ λ°μ΄ν° νμ μΌ κ²½μ°λ§ ν΄λΉνλ€.
- μμ λ°μ΄ν° νμ μ immutable valueμ΄κ³ μ¬ν λΉλ λΆκ°λ₯ νκΈ° λλ¬Έμ ν λΉ λ κ°μ λ³κ²½ν μ μλ€.
β οΈ const ν€μλλ‘ μ μΈλ λ³μμ κ°μ΄ κ°μ²΄μΌ κ²½μ° μΈλΆμ μν₯μΌλ‘ κ°μ΄ λ³κ²½λ μ μλ€.
νλ§λλ‘ λ³μμ μ¬ν λΉμ΄ κΈμ§λμ΄ μμ λΏ, κ°μ΄ λ³κ²½λ μλ μλ€.
λ³μ λͺ λͺ κ·μΉ
- μλ¬Έμμ μ«μ(0~9), κ·Έλ¦¬κ³ κΈ°νΈ
$
μ_
λ§ μ¬μ©ν μ μλ€. - 첫 κΈμμ μ«μλ₯Ό μ¬μ©ν μ μλ€.
- λ/μλ¬Έμλ₯Ό ꡬλ³νμ¬ μ¬μ©ν μ μλ€.
- μΌλ°μ μΌλ‘ camelCaseλ₯Ό μ¬μ©νλ€.
- μμ½μ΄λ μλ³μλ‘ μ¬μ©ν μ μλ€.
μμ½μ΄(reserved word)
μμ½μ΄λ νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λκ³ μκ±°λ μ¬μ©λ μμ μΈ λ¨μ΄λ₯Ό λ§νλ€.
μλ°μ€ν¬λ¦½νΈμ μμ½μ΄λ€
await break case catch class const continue debugger default delete do else enum export extends false finally for function if implements import in Instanceof interface let new null package private protected public return super static switch this throw true try typeof var void while with yield*
* μλ³μλ‘ μ¬μ© κ°λ₯νλ Strict Modeμμλ μ¬μ© λΆκ°
Dynamic Typing
μλ°μ€ν¬λ¦½νΈλ λμ νμ (dynamic/weak type) μΈμ΄μ΄λ€.
λ³μμ νμ μ§μ (Type annotation)μμ΄ κ°μ΄ ν λΉλλ κ³Όμ μμ κ°μ νμ μ μν΄ μλμΌλ‘ νμ μ΄ κ²°μ (Type Inference)λκΈ° λλ¬Έμ κ°μ λ³μμ μ¬λ¬ νμ μ κ°μ ν λΉν μ μλ€.
Variable Hoisting
μλ°μ€ν¬λ¦½νΈμ λͺ¨λ μ μΈλ¬Έμ νΈμ΄μ€ν (Hoisting)λλ€. λ³μ μ μΈ λν νΈμ΄μ€ν μ΄ λ°μνλ€.