λ¨Όμ , μ€μ½νμ λν΄μ μμλ³ΌκΉ?
μ€μ½νμ κΈ°λ³Έ κ°λ
μλ°μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μμ κ°μ₯ κΈ°λ³Έμ μ΄κ³ λ μ€μν κ°λ μ΄λ€.
function add(x, y) {
console.log(x, y)
return x + y
}
add(3, 6)
console.log(x, y)
// ReferenceError: x is not defined μ΄μ©κ³
- λ³μ μ΄λ¦, ν¨μ μ΄λ¦, ν΄λμ€ μ΄λ¦κ³Ό κ°μ μλ³μκ° λ³ΈμΈμ΄ μ μΈλ μμΉμ λ°λΌ λ€λ₯Έ μ½λμμ μμ μ΄ μ°Έμ‘°λ μ μμμ§ μμμ§ κ²°μ λλ κ²μ΄ μ€μ½νμ΄λ€.
CODE μ 체λ μ μκ³Ό μ§μμΌλ‘ ꡬλΆν μ μκΈ° λλ¬Έμ, μ΄λ ν λ³μκ° μ μμμ μ μΈλλ€λ©΄
ν΄λΉ λ³μλ μ μ μ€μ½νλ₯Ό κ°κ²λκ³ , μ§μμμ μ μΈλλ€λ©΄ ν΄λΉ λ³μλ μ§μ μ€μ½νλ₯Ό κ°κ²λλ€.
κ·Έλ λ€λ©΄,
μ΄λ€ μ½λκ° μ€νλ λ μ°Έμ‘°νλ €λ λ³μκ°
μ μμλ μλλ° μ§μμλ μκ³ ,
μ§μμλ μλλ° μ μμλ μλ€λ©΄?
μ½λλ μ΄λ€ λ³μλ₯Ό μ°Έμ‘°ν΄μΌν κΉ?
λ§μμ λλ μ무 λ³μλ μ°Έμ‘°νμ§ μλλ€!
꼬리μ 꼬리λ₯Ό 무λ μ€μ½ν 체μΈ
- ν¨μλ μ μμμ μ μκ° λ λλ μμ§λ§, μ΄λ€ ν¨μμ λ΄λΆμμ μ μλ μλ μλ€. ν¨μμ μ€μ²©
- μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μλ₯Ό μΈλΆ ν¨μλΌκ³ νλ€.
- μ΄μ²λΌ ν¨μκ° μ€μ²©μ΄ λλ€λ©΄ κ°κ°μ ν¨μμ μ§μ μ€μ½νλ μ€μ²©μ΄ λ μ μλ€.
μ¦, ν¨μμ μ€μ²©μ μν΄ κ³μΈ΅μ μΈ κ΅¬μ‘°λ₯Ό κ°μ§ μ μλ€λ μλ―Έ!
var x = 'λλ μ μ xμΌ'
function outer() {
var y = 'λλ outer ν¨μμ μ§μ yμΌ'
console.log(x)
console.log(y)
function inner() {
var x = 'λλ inner ν¨μμ μ§μ xμΌ'
console.log(x)
console.log(y)
}
inner()
}
outer()
console.log(x)
console.log(y)
- μμ μ½λλ μΈλΆν¨μμΈ
outer()
ν¨μμ μ€μ²©ν¨μμΈinner()
ν¨μλ₯Ό κ°μ§κ³ μλ€. - μ μμμ μ μΈλ x, outer ν¨μ λ΄λΆμμ μ μΈλ y, inner ν¨μμμλ μ μμμ μ μΈλ xκ° λκ°μ μ΄λ¦μΌλ‘ μ μΈλκ³ λ ν¨μκ° μ€νλλ€.
κ·ΈλΌ λ€μκ³Ό κ°μ μ½μμ΄ μ°νκ² μ§?
var x = 'λλ μ μ xμΌ'
function outer() {
var y = 'λλ outer ν¨μμ μ§μ yμΌ'
console.log(x) // 1οΈβ£ λλ μ μ xμΌ
console.log(y) // 2οΈβ£ λλ outer ν¨μμ μ§μ yμΌ
function inner() {
var x = 'λλ inner ν¨μμ μ§μ xμΌ'
console.log(x) // 3οΈβ£ λλ inner ν¨μμ μ§μ xμΌ
console.log(y) // 4οΈβ£ λλ outer ν¨μμ μ§μ yμΌ
}
inner()
}
outer()
console.log(x) // 5οΈβ£ λλ μ μ xμΌ
console.log(y) // 6οΈβ£ ReferrenceError μ΄μ©κ³
μ€μ½νμ ꡬκ°μ λλμ΄ λ³΄μλ©΄!
- inner ν¨μλ outer ν¨μ λ΄λΆμμ μ μΈμ΄ λμκΈ° λλ¬Έμ, inner ν¨μμ μμ μ€μ½νλ outer ν¨μμ μ€μ½νμ΄λ€.
- κ·Έλ¦¬κ³ μ μμμ μ μλ outer ν¨μμ μμ μ€μ½νλ μ μ μ€μ½νμ΄λ€.
- μ΄μ²λΌ, μ€μ½νκ° κ³μΈ΅μ μΌλ‘ μ°κ²°μ΄ λμ΄ μλ κ²μ μ€μ½ν 체μΈμ΄λΌκ³ νλ€. 물리μ μΌλ‘ μ‘΄μ¬ν¨!
- μλ°μ€ν¬λ¦½νΈ μμ§μ μ€μ½ν 체μΈμ ν΅ν΄ λ³μλ₯Ό μ°Έμ‘°νλ€.
- νμ¬ ν¨μκ° μ΄λ€ λ³μλ₯Ό μ°Έμ‘°νλ €κ³ νλλ° λ΄ μ€μ½ν μμ μνλ λ³μκ° μλ€λ©΄?
JS
: μ€μΌμ΄~ νλ μλ‘ μ¬λΌκ°λ€!
νλ μλ‘ μ¬λΌκ°λλ°λ λ΄κ° μνλ λ³μκ° μλ€?
JS
: ν λ² λ μλ‘ μ¬λΌκ°μ§ λ~
μ΄λ κ² μμμ μλ‘ μ¬λΌκ°λ©΄ μ΅μμμΈ μ μ μ€μ½νκΉμ§ μ¬λΌκ°κ² λλ€.
κ·Έλ°λ°, μ μ μ€μ½νμλ λ΄κ° μνλ λ³μκ° μλ€λ©΄? μ΄ λ ReferrenceError λ₯Ό μΆλ ₯νλ€.
- νμ¬ ν¨μκ° μ΄λ€ λ³μλ₯Ό μ°Έμ‘°νλ €κ³ νλλ° λ΄ μ€μ½ν μμ μνλ λ³μκ° μλ€λ©΄?
- μ°Έκ³ λ‘ μ€μ½ν 체μΈμμ λ³μλ₯Ό μ°Έμ‘°ν λλ 무쑰건 μλ‘λ§ μ¬λΌκ°!
μ½λ©μ νλ©΄μ νμ μ€μ½νμμ μμ μ€μ½νλ₯Ό μ°Έμ‘°ν μ μλ μ΄μ κ° λ°λ‘ βμ€μ½ν 체μΈμ λ¨λ°©ν₯μ±β λλ¬Έμ΄λ€.
- μ½μ λ‘κ·Έ μ°νλ κ³Όμ : outer ν¨μ λ΄λΆ μ€μ½νμ κ°μ λ³μ xλ₯Ό μ°Ύλλ€. κ·Έλ°λ° λ³μ xκ° μμΌλκΉ νλμ© μλ‘ μ¬λΌκ°μ μ μ μ€μ½νμμ μ°ΎμΌλ©΄ λ°λ‘ μΆλ ₯νλ€.
μ€μ½νμ μ’ λ₯
μ€μ½νλ λͺ κ°μ§μ κΈ°μ€μ κ°μ§κ³ ꡬλΆν μ μλλ°,
μ΄λ ν λ 벨μ κ°μ§λλμ λ°λΌμ~
1. λΈλ‘ λ 벨 μ€μ½ν
λλΆλΆ νλ‘κ·Έλλ° μΈμ΄μμλ ν¨μμ λλΆμ΄μ ifλ¬Έ, forλ¬Έκ³Ό κ°μ λͺ¨λ μ½λ λΈλμ΄ μ§μ μ€μ½νλ₯Ό λ§λ λ€.
2. ν¨μ λ 벨 μ€μ½ν
λ°λ©΄, μλ°μ€ν¬λ¦½νΈμμλ var
ν€μλλ‘ μ μΈλ λ³μλ μ€λ‘μ§ ν¨μ μ½λ λΈλ‘λ§μ μ§μ μ€μ½νλ‘ μΈμ νλ€.
κ·Έλ°λ°, λ€λ₯Έ μΈμ΄μλ μλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μλ°μ€ν¬λ¦½νΈλ κ°κ³ μΆμ΄μ λ§λ€μ΄μ§ κ²μ΄ λ°λ‘ let
, const
ES 6 μ΄νλ‘λ let
, const
ν€μλλ₯Ό μ¬μ©νλ©΄ μλ°μ€ν¬λ¦½νΈμμ ν¨μ λΏλ§ μλλΌ
ifλ¬Έ, forλ¬Έ, try β¦ catchλ¬Έ λ± λͺ¨λ λΈλ‘ λ¨μμ λν μ€μ½νλ₯Ό κ°μ§ μ μλ€.
μμ μ€μ½νκ° κ²°μ λλ μμ μ λ°λΌμ~
ν¨μκ° μ΄λμ νΈμΆλμλμ§μ λ°λΌ, ν¨μκ° μ΄λμ μ μλμλμ§μ λ°λΌμ λλ μ μλ€.
1. λμ μ€μ½ν : νΈμΆλλ μμ
νλ‘κ·Έλ¨ λ°νμ λμ€μ μ€ν 컨ν μ€νΈλ νΈμΆ 컨ν μ€νΈμ μν΄μ μ€μ½νκ° κ²°μ λλ κ²μ μλ―Ένλ€.
2. μ μ μ€μ½ν : νμ΄λλ μμ
λ°λ©΄, ν¨μκ° μ μλλ μμ μ μμ μ€μ½νκ° κ²°μ λλ κ²μ μ μ μ€μ½ν(=== λ μ컬 μ€μ½ν)λΌκ³ νλ€.
μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ ν¨μκ° νμ΄λμλ§μ μμ μ€μ½νκ° κ²°μ μ΄ λκ³ ,
μ΄νμ ν΄λΉ ν¨μμ μν΄ ν¨μ κ°μ²΄κ° μμ±μ΄ λλ©΄ ν΄λΉ ν¨μ κ°μ²΄λ λ³ΈμΈμ μμ μ€μ½νλ₯Ό νμ μ μ μκ² λλ€.
- ν΄λΉ ν¨μκ° μμ μ€μ½νλ₯Ό νμ μ μ μκ² λλ μ΄μ λ μλ°μ€ν¬λ¦½νΈμμμ ν¨μλ νμ΄λλ©΄μ μμ μ λ΄λΆ μ¬λ‘―μ μμ μ€μ½ν μ°Έμ‘°λ₯Ό μ μ₯νκΈ° λλ¬Έμ΄λ€!
- νμ΄λ ν¨μκ° μ΄λμ κ° νΈμΆμ΄ λλ©΄, μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ λ€μκ³Ό κ°μ νλ¦μΌλ‘ μ§νλλ€.
- νΈμΆλ ν¨μμ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ€.
- μ΄λ₯Ό μ€ν 컨ν μ€νΈ μ€νμ push νλ€.
- κ·Έ νμ ν¨μλ λ μ컬 νκ²½μ μμ±νλ€.
μ΄λ ν μ½λκ° μ΄λμ μ€νμ΄ λκ³ , λ³ΈμΈ μ£Όλ³μ μ΄λ€ μ½λκ° μλμ§ κ΅¬μ²΄μ μΈ μ 보λ₯Ό λ΄κ³ μλ νκ²½μΌλ‘,
λ μ컬 νκ²½μ ν¨μ λ³ΈμΈ λ΄λΆμ μλ³μ, μλ³μμ λ°μΈλ© λ κ° λ±μ κΈ°λ‘νκ³ μλ νλμ μλ£ κ΅¬μ‘°μ΄λ€. - μ½λμ μ€νμ΄ λλλ©΄ μ€ν 컨ν μ€νΈ μ€νμμ ν΄λΉ 컨ν μ€νΈλ₯Ό pop νμ¬ μ κ±°νλ€!
μμμ λ§ν λ΄μ©μ ν λλ‘ μ½λ νλλ₯Ό λΆμν΄λ³΄μ!
const x = 1
function outer() {
const x = 10
const inner = function () {
console.log(x)
}
return inner
}
const hongcha = outer()
hongcha()
Q. μ μΌ λ§μ§λ§μ μλ hongcha()
λ μ΄λ€ κ°μ μ½μμ μ°μκΉ? 1 or 10?
- μ½λ λμ μ€λͺ
-
outer()
ν¨μκ° μ μΈλμ΄ μκ³ , κ·Έ μμ λ³μ xκ° μ μΈλμ΄ μλ€.
μ΄μ΄μ ν¨μ λ΄λΆμinner()
ν¨μκ° ννλμ΄ μλ€.
outer()
ν¨μλ μ€μ²© ν¨μinner()
λ₯Ό hongchaμκ² λ°ννλ©΄μ μλͺ μ£ΌκΈ°λ₯Ό λ§κ°νλ ν¨μμ΄λ€. -
μ¦,
outer()
ν¨μμ νΈμΆμ΄ μ’ λ£λλ©΄outer()
ν¨μμ μ€ν 컨ν μ€νΈλ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°κ° λλ€. -
λ°λΌμ
outer()
ν¨μμ λ΄λΆμ μ μΈλ λ³μ xλ μλͺ μ£ΌκΈ°λ₯Ό λ§κ°νκ² λκ³ ,
κ·Έλ κ²const x = 10;
μ μ κ·Όν λ°©λ²μ΄ μΌλ¨μ μμ΄λ³΄μΈλ€..!
νμ§λ§, μ½λλ₯Ό μ€νν΄λ³΄λ©΄ β10βμ΄λΌλ κ°μ΄ λμ€κ² λλ€.
μ£½μ xλ μ΄λ»κ² μ΄μ λμμμκΉ?!
xκ° λ€μ μ΄μλ μ΄μ λ₯Ό μκΈ° μν΄ ν΄λ‘μ Έλ₯Ό μμ보μ!
ν΄λ‘μ Έλ? π
μ€μ²© ν¨μ inner()
κ° μ΄λ―Έ μλͺ
μ£ΌκΈ°λ₯Ό λ§κ°ν outer()
ν¨μλ₯Ό μ°Έμ‘°ν μ μμλ€.
μ΄μ²λΌ μΈλΆ ν¨μμ μ§μ λ³μ xλ₯Ό μ°Έμ‘°ν μ μλ€λ©΄, μ΄ λ innerλ₯Ό ν΄λ‘μ ΈλΌκ³ νλ€.
μ΄λ κ² λ μ μλ κ³Όμ μ μμ£Όμμ£Ό κ°λ¨νκ² μ΄ν΄λ³΄λ©΄,
outer()
ν¨μκ° μ’ λ£λκΈ° μ , μ€ν 컨ν μ€νΈ λ μ컬 νκ²½μ λͺ¨μ΅
outer()
ν¨μκ° μ€ν μ€μ μλ€κ° μλͺ μ£ΌκΈ°λ₯Ό λ§κ°νλ©΄μ μ΅μ’ μ μΌλ‘ μ’ λ£λμμ λ λͺ¨μ΅
outer
ν¨μμ μλͺ μ£ΌκΈ°κ° λλλ©΄ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°λλ€.- μ΄ λ,
outer
ν¨μλhongcha
μκ²inner
ν¨μλ₯Ό λ°ννλ©΄μ μ¬λΌμ§λ€.
(+ ν¨μλ JSμμ 1κΈ κ°μ²΄λΌμ κ°μΌλ‘ νκ°ν μ μλ€. μ€νμ λ€μ μμ΄λ κ°λ μ΄ μλλ€!) outer
ν¨μκ° μ’ λ£λλ©΄μ μ€ν 컨ν μ€νΈ μ€νμμλ μμ ν μ κ±°λμμ§λ§,outer()
λ μ컬 νκ²½κΉμ§λ μμ λμ§ μλλ€.hongcha
λinner
ν¨μ κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ μκ³ ,inner
ν¨μ κ°μ²΄λ λ³ΈμΈμ λ΄λΆ μ¬λ‘―μ μ μ₯λouter()
λ μ컬 νκ²½μ μ°Έμ‘°νκΈ° λλ¬Έμ garbage collectionμ λμμ΄ λμ§ μλλ€!- λ°λΌμ,
hongcha
μ μν΄inner
ν¨μλ₯Ό λ€μ νΈμΆμ νλ©΄,outer
ν¨μμ μλ 10μ κ°μΌλ‘ κ°μ§κ³ μλ λ³μ xλ₯Ό λ€μ μ°Έμ‘°ν μ μκ²λλ€. inner
ν¨μ κ°μ²΄ κΈ°μ€μμ, μΈλΆ ν¨μλ μλͺ μ£ΌκΈ°λ₯Ό λ§κ°νκ³ μ€ν 컨ν μ€νΈ μ€νμμ μ¬λΌμ‘μ§λ§
π‘λ΄κ° κΈ°μ΅νκ³ μλ λ΄λΆ μ¬λ‘―μ μ μ₯λ! μμ μ€μ½νμ μμ‘΄ν μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°ν μ μλ€. ν΄λ‘μ Έ
ν μ€μ²© ν¨μκ° μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νκ³ μκ³ ,
κ±°κΈ°μ μ€μ²©ν¨μμ μΈλΆ ν¨μλ³΄λ€ λ μ€λ μ΄μμλ€λ©΄ (= μ μ§κ° λλ€λ©΄)
μ΄ μ€μ²©ν¨μλ ν΄λ‘μ Έ! ν΄λ‘μ Έλ λ³ΈμΈμ μμ μ€μ½νμμ νμ¬ μ°Έμ‘°νλ μλ³μλ§ κΈ°μ΅νλ€.
- ν΄λ‘μ Έμ μν΄μ μ°Έμ‘°λ λ³μλ₯Ό βμμ λ³μβλΌκ³ νλ€.
- ν΄λ‘μ Έλ μ΄λ¦λΆν° μ½κ° λ«νμλ€λ λλμ΄ λλλ°, ν¨μ λ³ΈμΈμ΄ κΈ°μ΅νκ³ μλ μμ λ³μμ μν΄ λ«νμλ€? κ°νμλ€?κ³ μκ°ν μ μλ€.
- μ΄λ¬ν ν΄λ‘μ Έλ νλμ stateκ° μλμΉμκ² λ³κ²½λμ§ μλλ‘
stateλ₯Ό μμ νκ² μλνκ³ , λλ νΉμ ν¨μμκ²λ§ state λ³κ²½μ νμ©νκΈ° μν΄ μ¬μ©νλ€!