π‘ [MDN]
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλ λ μ컬 νκ²½κ³Όμ μ‘°ν©μ΄λ€
const x = 1;
function outerFunc() {
const x = 10;
function innerFunc() {
console.log(x); // 10
}
innerFunc();
}
outerFunc();
outerFunc
ν¨μ λ΄λΆμμ μ€μ²© ν¨μ innerFunc
κ° μ μλκ³ νΈμΆλμλ€.innerFunc
μ μμ μ€μ½νλ μΈλΆ ν¨μ outerFunc
μ μ€μ½νλ€. innerFunc
λ΄λΆμμ μμ μ ν¬ν¨νκ³ μλ μΈλΆ ν¨μ outerFunc
μ x λ³μμ μ κ·Όν μ μλ€.const x = 1;
// innerFunc()μμλ outerFunc()μ xμ μ κ·Όν μ μμ£ .
// Lexical Scopeλ₯Ό λ°λ₯΄λ νλ‘κ·Έλλ° μΈμ΄μ΄κΈ° λλ¬Έ
function outerFunc() {
const x = 10;
innerFunc(); // 1
}
function innerFunc() {
console.log(x); // 1
}
outerFunc();
innerFunc
ν¨μκ° outerFunc
ν¨μμ λ΄λΆμμ μ μλ μ€μ²© ν¨μκ° μλλΌλ©΄ innerFunc
ν¨μλ₯Ό outerFunc
ν¨μμ λ΄λΆμμ νΈμΆνλ€ νλλΌλ outerFunc
ν¨μμ λ³μμ μ κ·Όν μ μλ€.outerFunc
λ΄μμ innerFunc
κ° 'νΈμΆ'λκ³ μμμλ λΆκ΅¬νκ³ 'μ μΈ'μ λ°μμ λμκΈ° λλ¬Έμ μ€μ½νλ₯Ό 곡μ νμ§ μλλ€!π λ μ컬 μ€μ½ν
- μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μλ₯Ό μ΄λμ 'νΈμΆ'νλμ§κ° μλλΌ ν¨μλ₯Ό μ΄λμ 'μ μ'νλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€. μ΄λ₯Ό λ μ컬 μ€μ½ν(μ μ μ€μ½ν)λΌ νλ€.
const x = 1;
function foo() {
const x = 10;
bar(); // bar ν¨μ 'νΈμΆ'
}
function bar() { // bar ν¨μ 'μ μ'
console.log(x);
}
foo(); // 1
bar(); // 1
foo
ν¨μμ bar
ν¨μλ λͺ¨λ μ μμμ μ μλ ν¨μλ€.foo
ν¨μμ bar
ν¨μμ μμ μ€μ½νλ "μ μ" μ΄λ€.const x = 1;
function foo() {
const x = 10;
// μμ μ€μ½νλ ν¨μ μ μ νκ²½(μμΉ)μ λ°λΌ κ²°μ λλ€.
// ν¨μ νΈμΆ μμΉμ μμ μ€μ½νλ μλ¬΄λ° κ΄κ³κ° μλ€.
bar();
}
// ν¨μ barλ μμ μ μμ μ€μ½ν, μ¦ μ μ λ μ컬 νκ²½μ [[Environment]]μ μ μ₯νμ¬ κΈ°μ΅νλ€.
function bar() {
console.log(x);
}
foo();
bar();
- μΈλΆ ν¨μλ³΄λ€ μ€μ²© ν¨μκ° λ μ€λ μ μ§λλ κ²½μ°, μ€μ²©ν¨μλ μ΄λ―Έ μλͺ μ£ΌκΈ°κ° μ’ λ£ν μΈλΆ ν¨μμ λ³μλ₯Ό
μ¬μ ν
μ°Έμ‘°ν μ μλ€!- μ΄ κ°λ μμ μ€μ²©ν¨μκ° λ°λ‘ ν΄λ‘μ !
const x = 1;
function outer() {
const x = 10;
const inner = function () {
console.log(x); // 10
};
return inner;
}
const innerFunc = outer();
innerFunc();
outer
ν¨μλ₯Ό νΈμΆνλ©΄ μ€μ²©ν¨μ inner
λ₯Ό λ°ννκ³ μλͺ
μ£ΌκΈ°λ₯Ό λ§κ°νλ€.outer
μ μ€νμ΄ μ’
λ£λλ©΄ outer
ν¨μμ μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ μ κ±°(pop) λλ€.outer
ν¨μμ μ€ν 컨ν
μ€νΈκ° μ κ±°λμμΌλ―λ‘ outer ν¨μμ μ§μλ³μ x λν μλͺ
μ£ΌκΈ°λ₯Ό λ§κ°νλ€. λ°λΌμ outer
ν¨μμ μ§μλ³μ xλ λλ μ ν¨νμ§ μκ² λμ΄ x λ³μμ μ κ·Όν λ°©λ²μ λ¬λ¦¬ μμ΄λ³΄μΈλ€.outer
ν¨μμ μ§μ λ³μ xμ κ°μΈ 10 μ΄λ€.inner
ν¨μκ° innerFunc
μ μ λ¬λμλλ°, inner
ν¨μλ outer
ν¨μμ λ μ컬 νκ²½μ "μ¬μ ν" μ°Έμ‘°νκ³ μλ€.outer
μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ μ κ±°(pop) λμ§λ§, outer
ν¨μμ λ μ컬 νκ²½κΉμ§ μλ©Ένλ κ²μ μλλ€. κ·Έλ¬λ―λ‘ outer
ν¨μμ μ§μλ³μ x μ°Έμ‘° κ°λ₯νλ€.outer
ν¨μμ λ μ컬 νκ²½μ μ°Έμ‘°νλ κ³³μ΄ μμΌλ λλλ κ²μ΄λ€!// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ #1
// ν¨μκ° νΈμΆλ λλ§λ€ νΈμΆλ νμλ₯Ό λμ νμ¬ μΆλ ₯νλ μΉ΄μ΄ν°λ₯Ό ꡬνν΄μ!
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ
const increase = function () {
// μΉ΄μ΄νΈ μνλ₯Ό 1λ§νΌ μ¦κ°μν¨λ€.
return ++num;
};
console.log(increase()); // 1
num = 100; // μΉλͺ
μ μΈ λ¨μ μ΄ μμ΄μ. μ 보 μ κ·Όμ λ§μ μ μμ΄μ.
console.log(increase()); // 101
console.log(increase()); // 102
increase()
κ° νΈμΆλκΈ° μ κΉμ§ λ³κ²½λμ§ μκ³ μ μ§λμ΄μΌ νλ€.increase()
λ§ λ³κ²½ν μ μμ΄μΌ νλ€.increase()
ν¨μμ μ§μλ³μλ‘ λ°κΎΈμ΄λ³΄μ.// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ #2
const increase = function () {
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// μΉ΄μ΄νΈ μνλ₯Ό 1λ§νΌ μ¦κ°μν¨λ€.
return ++num;
};
// μ΄μ μνκ°μ μ μ§ λͺ»ν¨
console.log(increase()); //1
console.log(increase()); //1
console.log(increase()); //1
increase()
ν¨μμ μ§μλ³μλ‘ λ³κ²½νμ¬ μλμΉ μμ μν λ³κ²½μ λ°©μ§νλ€. μ΄μ num λ³μμ μνλ increase()
ν¨μλ§ λ³κ²½ν μ μλ€.increase()
ν¨μκ° νΈμΆλ λλ§λ€ μ§μλ³μ numμ΄ μ΄κΈ°νλλ€.// μΉ΄μ΄νΈ μν λ³κ²½ ν¨μ #3
const increase = (function () {
// μΉ΄μ΄νΈ μν λ³μ
let num = 0;
// ν΄λ‘μ
return function () {
return ++num;
};
}());
// μ΄μ μνκ°μ μ μ§
console.log(increase()); //1
console.log(increase()); //2
console.log(increase()); //3
increase
λ³μμ ν λΉλλ€.increase
λ³μμ ν λΉλ ν¨μλ μμ μ΄ μ μλ μμΉμ μν΄ κ²°μ λ μμ μ€μ½νμΈ μ¦μ μ€ν ν¨μμ λ μ컬 νκ²½μ κΈ°μ΅νλ ν΄λ‘μ λ€.increase
λ³μμ ν λΉλμ΄ νΈμΆλλ€.π κ²°λ‘
ν΄λ‘μ λ μν(state)κ° μλμΉ μκ² λ³κ²½λμ§ μλλ‘ μμ νκ² μλ(information hiding) νκ³ νΉμ ν¨μμκ²λ§ μν λ³κ²½μ νμ©νμ¬ μνλ₯Ό μμ νκ² λ³κ²½νκ³ μ μ§νκΈ° μν΄ μ¬μ©νλ€.