ν΄λ‘μ
ν΄λ‘μ λ ν¨μμ κ·Έ ν¨μκ° μ μΈλ λ μ컬 νκ²½μ μ‘°ν©
λ μ컬 νκ²½μ μ΄ν΄
const x = 1;
function outerFunc() {
const x = 10;
innerFunc();
}
function innerFunc() {
console.log(x); // 1
}
outerFunc();
- μλ°μ€ν¬λ¦½νΈλ λ μ컬 μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ μ€μ²©λ ν¨μκ° μλλΌλ©΄ outerFunc ν¨μμ λ³μμ μ κ·Όν μ μλ€.
λ μ컬 μ€μ½ν
- μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ ν¨μλ₯Ό μ΄λμ μ μνλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€. μ΄λ₯Ό λ μ컬 μ€μ½ν(μ μ μ€μ½ν)λΌκ³ νλ€.
- μ μμμ μ μλ ν¨μμ μμ μ€μ½νλ μ μμ΄λ€.
- μ€ν컨ν
μ€νΈμ λ μ컬 νκ²½μ μμ μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ μμ μ€μ½νμ μ°Έμ‘°λ₯Ό μ μ₯ν (= μ€μ½ν 체μΈ)
μ 리
λ μ컬 νκ²½μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ μ μ₯ν μ°Έμ‘°κ°, μ¦ μμ μ€μ½νμ λν μ°Έμ‘°λ ν¨μ μ μκ° νκ°λλ μμ μ ν¨μκ° μ μλ νκ²½(μμΉ)μ μν΄ κ²°μ λλ€. μ΄κ²μ΄ λ μ컬 μ€μ½ν
ν¨μ κ°μ²΄μ λ΄λΆ μ¬λ‘― [[ Environment ]]
- ν¨μκ° μ μλ νκ²½ νΈμΆλ νκ²½μ λ€λ£° μ μμΌλ―λ‘ ν¨μλ μμ μ΄ νΈμΆλ μμΉμ μκ΄μμ΄ μμ μ€μ½νλ₯Ό κΈ°μ΅ν΄μΌ ν©λλ€.
- ν¨μλ μμ μ λ΄λΆ μ¬λ‘―
[[ Environment ]]
μ μμ μ΄ μ μλ νκ²½, μ¦ μμ μ€μ½νμ μ°Έμ‘°λ₯Ό μ μ₯νλ€. - ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ μμ μ€μ½νκ°
[[ Environment ]]
μ μ μ₯ λ¨ - μ¦
[[ Environment ]]
μ μ μ λλ μμ μ€μ½ν μ°Έμ‘°λ νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½ [[ Environment ]]
μ μ μ₯λ μμ μ€μ½νμ μ°Έμ‘° κ°μ μμ μ΄ νΈμΆ λμμ λ μμ±λ λ μ컬 νκ²½μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ μ μ₯λ μ°Έμ‘° κ°- ν¨μ κ°μ²΄λ μμ μ΄ μ‘΄μ¬νλν
[[ Environment ]]
μ μ μ₯ν λ μ컬νκ²½μ μ°Έμ‘°(μμ μ€μ½ν)λ₯Ό κΈ°μ΅νλ€.
const x = 1;
function foo() {
const x = 10;
// μμ μ€μ½νλ ν¨μ μ μ νκ²½(μμΉ)μ λ°λΌ κ²°μ λλ€.
// ν¨μ νΈμΆ μμΉμ μμ μ€μ½νλ μλ¬΄λ° κ΄κ³κ° μλ€.
console.log(x); // 10
bar();
}
// ν¨μ barλ μμ μ μμ μ€μ½ν, μ¦ μ μ λ μ컬 νκ²½μ [[Environment]]μ μ μ₯νμ¬ κΈ°μ΅νλ€.
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
ν΄λ‘μ μ λ μ컬 νκ²½
const x = 1;
function outer() {
const x = 10;
const inner = function () { console.log(x); }; //
return inner;
}
// outer ν¨μλ₯Ό νΈμΆνλ©΄ μ€μ²© ν¨μ innerλ₯Ό λ°ννλ€.
// κ·Έλ¦¬κ³ outer ν¨μμ μ€ν 컨ν
μ€νΈλ μ€ν 컨ν
μ€νΈ μ€νμμ νλμ΄ μ κ±°λλ€.
const innerFunc = outer();
innerFunc(); // 10
- outer ν¨μμ μ€νμ΄ μ’
λ£λκ³ μ€ν컨ν
μ€νΈ μ€νμ μ κ±° λμμμλ
innerFunc()
μ΄ outerν¨μ λ΄λΆμ xμ μ κ·Όνκ³ μλ€. - μ΄μ²λΌ μΈλΆ ν¨μλ³΄λ€ μ€μ²©ν¨μκ° λ μ€λ μ μ§λλ κ²½μ° μλͺ
μ£ΌκΈ°κ° μ’
λ£ν μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€. μ΄λ¬ν μ€μ²© ν¨μλ₯Ό ν΄λ‘μ (
closure
)λΌκ³ λΆλ₯Έλ€. - μ€ν컨ν μ€νΈ μ€νμμ μ κ±° λλ outerν¨μμ λ μ컬νκ²½μ innerν¨μμμ μ°Έμ‘° νκ³ μμΌλ―λ‘ κ°μ§λΉμ»¬λ ν°μ λμμ΄ λμ§ μλλ€.
ν΄λ‘μ 쑰건
- μ΄λ‘ μ μλ°μ€ν¬λ¦½νΈμ λͺ¨λ ν¨μλ μμ μ€μ½νλ₯Ό κΈ°μ΅νλ―λ‘ λͺ¨λ ν΄λ‘μ , νμ§λ§ λͺ¨λ ν¨μλ₯Ό ν΄λ‘μ λΌκ³ νμ§ μλλ€
- ν΄λ‘μ κ° μλ κ²½μ°
- μμ μ€μ½νμ μ΄λ ν μλ³μλ μ°Έμ‘° νμ§ μλ κ²½μ°
λΈλΌμ°μ μμ μ΅μ νλ₯Ό ν΅ν΄ μμ μ€μ½νλ₯Ό κΈ°μ΅νμ§ μμ (μ¬μ©νμ§λ μλλ° μ°Έμ‘°νλ©΄ λ©λͺ¨λ¦¬ λλΉ)
- μΈλΆ ν¨μλ‘ μ€μ²© ν¨μλ₯Ό λ°ν νμ§ μλ κ²½μ°
μΈλΆν¨μλ³΄λ€ μ€μ²©ν¨μμ μλͺ μ£ΌκΈ°κ° μ§§μμ§κΈ° λλ¬Έμ ν΄λ‘μ λΌκ³ νμ§ μλλ€.
- μμ μ€μ½νμ μ΄λ ν μλ³μλ μ°Έμ‘° νμ§ μλ κ²½μ°
- μ 리
ν΄λ‘μ 쑰건 : μ€μ²© ν¨μκ° μμ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νκ³ μκ³ , μΈλΆ ν¨μ λ³΄λ€ μλͺ μ£ΌκΈ°κ° λ κΈ΄ κ²½μ° - ν΄λ‘μ μ μν΄ μ°Έμ‘°λλ μμ μ€μ½νμ λ³μλ₯Ό μμ λ³μ λΌκ³ νλ€.
ν΄λ‘μ μ νμ©
- ν΄λ‘μ λ μν(
state
)λ₯Ό μμ νκ² λ³κ²½νκ³ μ μ§νκΈ° μν΄ μ¬μ©νλ€. - μνλ₯Ό μμ νκ² μλ νκ³ νΉμ ν¨μμκ²λ§ μν λ³κ²½μ νμ©νκΈ° μν΄ μ¬μ©
- ν΄λ‘μ μ¬μ© μμ
// ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°κ³ ν¨μλ₯Ό λ°ννλ κ³ μ°¨ ν¨μ
// μ΄ ν¨μλ μΉ΄μ΄νΈ μνλ₯Ό μ μ§νκΈ° μν μμ λ³μ counterλ₯Ό κΈ°μ΅νλ ν΄λ‘μ λ₯Ό λ°ννλ€.
function makeCounter(aux) {
// μΉ΄μ΄νΈ μνλ₯Ό μ μ§νκΈ° μν μμ λ³μ
let counter = 0;
// ν΄λ‘μ λ₯Ό λ°ν
return function () {
// μΈμλ‘ μ λ¬ λ°μ 보쑰 ν¨μμ μν λ³κ²½μ μμνλ€.
counter = aux(counter);
return counter;
};
}
// 보쑰 ν¨μ
function increase(n) {
return ++n;
}
// 보쑰 ν¨μ
function decrease(n) {
return --n;
}
// ν¨μλ‘ ν¨μλ₯Ό μμ±νλ€.
// makeCounter ν¨μλ 보쑰 ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°μ ν¨μλ₯Ό λ°ννλ€
const increaser = makeCounter(increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
// increaser ν¨μμλ λ³κ°μ λ
립λ λ μ컬 νκ²½μ κ°κΈ° λλ¬Έμ μΉ΄μ΄ν° μνκ° μ°λνμ§ μλλ€.
const decreaser = makeCounter(decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2
- counterλΌλ μμ λ³μ μ¬μ© , ν¨μλ₯Ό μΈμλ‘ μ λ¬ λ°μ μ΄ ν¨μλ₯Ό μ€ν νμ¬ counter κ°μ μ μ₯νκ³ λ°ννλ ν¨μλ₯Ό μ€μ²© ν¨μλ‘ λ°ννκ³ μμ (ν΄λ‘μ 쑰건 λ§μ‘±)
- λ¨
makeCounter
ν¨μμ κ°κ° 보쑰 ν¨μλ₯Ό μ λ¬νμ¬ λ 립λ λ μ컬 νκ²½ μμ±νλ―λ‘ counterκ° κ³΅μ νμ§ μλλ€.
const counter = (function () {
let counter = 0;
return function (aux) {
counter = aux(counter);
return counter;
};
}());
function increase(n) {
return ++n;
}
function decrease(n) {
return --n;
}
- μ¦μ μ€ν ν¨μ μ¬μ©νμ¬ counter ν¨μμ λ μ컬 νκ²½μ 곡μ ν μ μλλ‘ λ§λ€ μ μλ€.
μΊ‘μνμ μ 보 μλ
- μΊ‘μν : κ°μ²΄μ μνλ₯Ό λνλ΄λ νλ‘νΌν°μ νλ‘νΌν°λ₯Ό μ°Έμ‘°νκ³ μ‘°μν μ μλ λ©μλ(λμ)μ νλλ‘ λ¬Άλ κ²μ λ§ν¨
- μλ : κ°μ²΄μ νΉμ νλ‘νΌν°λ λ©μλλ₯Ό κ°μΆ λͺ©μ μΌλ‘ μ¬μ©
- μλ°μ€ν¬λ¦½νΈλ μ κ·Ό μ νμλ₯Ό μ 곡νμ§ μμ κΈ°λ³Έμ μΌλ‘ λͺ¨λ
public
- ν΄λ‘μ νμ©νμ¬ μλμ΄ κ°λ₯ν κ² μ²λΌ ꡬνκ°λ₯
const Person = (function () {
let _age = 0; // private
// μμ±μ ν¨μ
function Person(name, age) {
this.name = name; // public
_age = age;
}
// νλ‘ν νμ
λ©μλ
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
// μμ±μ ν¨μλ₯Ό λ°ν
return Person;
}());
const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
- μ 보 μλμ΄ κ°λ₯ν κ² μ²λΌ 보μ΄μ§λ§ μμ νκ² μ§μ λμ§ μλλ€, νλ‘ν νμ λ©μλλ₯Ό 곡μ νκΈ° λλ¬Έμ _age μν μ μ§ λΆκ°λ₯ ν¨
μμ£Ό λ°μνλ μ€μ
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function () { return i; }; // β
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]()); // β‘
}
- iλ₯Ό 리ν΄νλ ν¨μλ₯Ό funcλΌλ λ°°μ΄μ μ μ₯νλ λ°λ³΅λ¬Έμ΄λ€.
- iλ₯Ό
var
λ‘ μ μ₯ν΄μvar
λ μ μ κ°μ²΄μ νλ‘νΌν°κ° λκΈ° λλ¬Έμ 무쑰건 3μ 리ν΄νκ²λ¨ (iκ° 3μ΄λκΉ) - ν΄λ‘μ λ‘ ν΄κ²°
var funcs = [];
for (var i = 0; i < 3; i++){
funcs[i] = (function (id) { // β
return function () {
return id;
};
}(i));
}
for (var j = 0; j < funcs.length; j++) {
console.log(funcs[j]());
}
- id κ°μ΄ μμ λ³μκ° λμ΄ κ°μ΄ μ μ§ λ¨
let
ν€μλλ₯Ό μ¬μ©ν΄μ ν΄κ²°ν μλ μμ, λ¨let
μ λΈλ‘ λ 벨 μ€μ½νμ΄κΈ° λλ¬Έμ λ°λ³΅λ¬Έμ΄ μ€ν λ λλ§λ€ iκ°μ μ μ₯ν λ μ컬 νκ²½μ΄ μμ±λ¨- λ³΄ν΅ λ°λ³΅λ¬Έμ forλ¬Έ λλκ³ μ¬λΌμ§μ§λ§ μ μμ λ λ΄λΆμ ν¨μκ° iκ°μ μ¬μ©νκΈ° λλ¬Έμ κ°λΉμ§ 컬λ ν° λμ λμ§ μμ
- κ³ μ°¨ ν¨μλ₯Ό μ¬μ©νλ λ°©λ² λ μλ€.
// μμκ° 3κ°μΈ λ°°μ΄μ μμ±νκ³ λ°°μ΄μ μΈλ±μ€λ₯Ό λ°ννλ ν¨μλ₯Ό μμλ‘ μΆκ°νλ€.
// λ°°μ΄μ μμλ‘ μΆκ°λ ν¨μλ€μ λͺ¨λ ν΄λ‘μ λ€.
const funcs = Array.from(new Array(3), (_, i) => () => i); // (3) [Ζ, Ζ, Ζ]
// λ°°μ΄μ μμλ‘ μΆκ°λ ν¨μ λ€μ μμ°¨μ μΌλ‘ νΈμΆνλ€.
funcs.forEach(f => console.log(f())); // 0 1 2
'javascript > π study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[5μ£Όμ°¨ μ€ν°λ]26μ₯-ES6 ν¨μ μΆκ° κΈ°λ₯ (0) | 2022.03.27 |
---|---|
[5μ£Όμ°¨ μ€ν°λ]25μ₯-ν΄λμ€ (0) | 2022.03.27 |
[4μ£Όμ°¨ μ€ν°λ] 23μ₯-μ€ν 컨ν μ€νΈ (0) | 2022.02.23 |
[4μ£Όμ°¨ μ€ν°λ] 22μ₯- this (0) | 2022.02.23 |
[4μ£Όμ°¨ μ€ν°λ] 21μ₯- λΉνΈμΈ κ°μ²΄ (0) | 2022.02.23 |
λκΈ