ν΄λ‘œμ €(closure)λŠ” λ‚œν•΄ν•˜κΈ°λ‘œ 유λͺ…ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°œλ… 쀑 ν•˜λ‚˜λ‘œ MDN μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ •μ˜ν•œλ‹€.

β€œ A closure is the combination of a function and the lexical environment within which that function was declared.”

ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Όμ˜ 쑰합이닀.

μœ„ μ •μ˜μ˜ 핡심 ν‚€μ›Œλ“œλŠ” β€œν•¨μˆ˜κ°€ μ„ μ–Έλœ λ ‰μ‹œμ»¬ ν™˜κ²½β€ 이닀.


⭐ 24.1 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. 이λ₯Ό λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)라 ν•œλ‹€.


⭐ 24.2 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ κ°œλ…μ΄ κ°€λŠ₯ν•˜λ €λ©΄ ν•¨μˆ˜λŠ” μžμ‹ μ΄ ν˜ΈμΆœλ˜λŠ” ν™˜κ²½κ³ΌλŠ” 상관없이 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„(ν•¨μˆ˜ μ •μ˜κ°€ μœ„μΉ˜ν•˜λŠ” μŠ€μ½”ν”„κ°€ λ°”λ‘œ μƒμœ„ μŠ€μ½”ν”„λ‹€)λ₯Ό κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ν•¨μˆ˜λŠ” μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•œλ‹€.

이 λ•Œ μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μ €μž₯된 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ 가리킨닀. λ˜ν•œ μžμ‹ μ΄ 호좜 λ˜μ—ˆμ„ λ•Œ 생성될 ν•¨μˆ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ β€œμ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ 참쑰”에 μ €μž₯될 값이닀.

⭐ 24.3 ν΄λ‘œμ €μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½

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 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ outerν•¨μˆ˜λŠ” innerλ₯Ό λ°˜ν™˜ν•˜κ³  생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•˜λŠ”λ° 이 λ•Œ outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x λ˜ν•œ 생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ outer ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜ x값인 10이 λ™μž‘ν•˜λŠ”λ° 이λ₯Ό ν΄λ‘œμ €λΌκ³  ν•œλ‹€.

ν΄λ‘œμ €λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €(closure) 라고 λΆ€λ₯Έλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μžμ‹ μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€κ³  ν–ˆλ‹€. λͺ¨λ“  ν•¨μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λ“  상관없이 μœ μ§€λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λ“  상관없이 ν•¨μˆ˜λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 있으며 μ‹λ³„μžμ— 바인딩 된 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.

μœ„ μ½”λ“œμ—μ„œ outer ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œν•˜λ©΄ outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λ˜μ§€λ§Œ outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ inner ν•¨μˆ˜μ˜ [[Environment]] λ‚΄λΆ€ μŠ¬λ‘―μ— μ˜ν•΄ 참쑰되고 있고 inner ν•¨μˆ˜λŠ” μ „μ—­λ³€μˆ˜ innerFunc에 μ˜ν•΄ 참쑰되고 μžˆμœΌλ―€λ‘œ 가비지 μ»¬λ ‰μ…˜ λŒ€μƒμ΄ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 가비지 μ»¬λ ‰ν„°λŠ” λˆ„κ΅°κ°€κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ 곡간을 ν•¨λΆ€λ‘œ ν•΄μ œν•˜μ§€ μ•ŠλŠ”λ‹€.

쀑첩 ν•¨μˆ˜ inner λŠ” μ™ΈλΆ€ ν•¨μˆ˜ outer 보닀 더 였래 μƒμ‘΄ν–ˆκ³ , 이 λ•Œ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μƒμ‘΄ν•œ 쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 생쑴 μ—¬λΆ€(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ 생쑴 μ—¬λΆ€)와 상관 없이 μžμ‹ μ΄ μ •μ˜λœ μœ„μΉ˜μ— μ˜ν•΄ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 있고 μ‹λ³„μžμ˜ 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.

function foo() {
	const x = 1;
	const y = 2;
  const z = 10;
  // 일반적으둜 ν΄λ‘œμ €λΌκ³  ν•˜μ§€ μ•ŠλŠ”λ‹€.
  function bar() {
	  const z = 3;
    debugger;
	   // μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ”λ‹€.
     console.log(z);
  }
	return bar;
}

const bar = foo();
bar();

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜λ―€λ‘œ 이둠적으둜 λͺ¨λ“  ν•¨μˆ˜λŠ” ν΄λ‘œμ €μ΄μ§€λ§Œ 일반적으둜 λͺ¨λ“  ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. μœ„μ˜ μ½”λ“œμ—μ„œ μ€‘μ²©ν•¨μˆ˜ bar()λŠ” μ™ΈλΆ€ν•¨μˆ˜ foo() 보닀 더 였래 μœ μ§€λ˜μ§€λ§Œ μƒμœ„ μŠ€μ½”ν”„μ˜ μ–΄λ– ν•œ μ‹λ³„μžλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ €λŠ” μ΅œμ ν™”λ₯Ό 톡해 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ bar() ν•¨μˆ˜λŠ” ν΄λ‘œμ €λΌκ³  ν•  수 μ—†λ‹€.

ν΄λ‘œμ €λŠ” μ€‘μ²©ν•¨μˆ˜κ°€ μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•˜κ³  있고 쀑첩 ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ˜λŠ” κ²½μš°μ— ν•œμ •ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€. ν΄λ‘œμ €μ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό 자유 λ³€μˆ˜λΌκ³  λΆ€λ₯Έλ‹€.

ν΄λ‘œμžλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°•λ ₯ν•œ κΈ°λŠ₯으둜, ν•„μš”ν•˜λ‹€λ©΄ 적극적으둜 ν™œμš©ν•΄μ•Ό ν•œλ‹€. ν΄λ‘œμ €κ°€ μœ μš©ν•˜κ²Œ μ‚¬μš©λ˜λŠ” 상황을 μ‚΄νŽ΄λ³΄μž.

⭐ 24.4 ν΄λ‘œμ €μ˜ ν™œμš©

ν΄λ‘œμ €λŠ” μƒνƒœ(state)λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ³  μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. λ‹€μ‹œ 말해, μƒνƒœκ°€ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ 은닉(information hiding) ν•˜κ³  νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

// 카운트 μƒνƒœ λ³€μˆ˜
let num = 0;

// 카운트 μƒνƒœ λ³€κ²½ ν•¨μˆ˜
const increase = function () {
  // 카운트 μƒνƒœλ₯Ό 1만큼 증가 μ‹œν‚¨λ‹€.
  return ++num;
};

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3

μœ„μ˜ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 이유둜 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ κ°€λŠ₯성을 λ‚΄ν¬ν•˜κ³  μžˆλŠ” 쒋지 μ•Šμ€ μ½”λ“œμ΄λ‹€.

  1. 카운트 μƒνƒœλŠ” increase ν•¨μˆ˜κ°€ 호좜되기 μ „κΉŒμ§€ λ³€κ²½λ˜μ§€ μ•Šκ³  μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€.
  2. 이λ₯Ό μœ„ν•΄ 카운트 μƒνƒœλŠ” increase ν•¨μˆ˜λ§Œμ΄ λ³€κ²½ ν•  수 μžˆμ–΄μ•Όν•œλ‹€.

ν•˜μ§€λ§Œ 카운트 μƒνƒœλŠ” μ „μ—­ λ³€μˆ˜λ₯Ό 톡해 관리 되고 있기 λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šκ²Œ μƒνƒœκ°€ 변경될 수 μžˆλ‹€. λ”°λΌμ„œ increase ν•¨μˆ˜λ§Œμ΄ num λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  λ³€κ²½ν•  수 μžˆλ„λ‘ μ „μ—­λ³€μˆ˜ num을 increase ν•¨μˆ˜μ˜ μ§€μ—­λ³€μˆ˜λ‘œ λ°”κΎΈκ³  ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•΄ μ£ΌλŠ”κ²ƒμ΄ λ°”λžŒμ§ν•˜λ‹€.

// 카운트 μƒνƒœ λ³€κ²½ ν•¨μˆ˜
const increase = (function () {
  // 카운트 μƒνƒœ λ³€μˆ˜
  let num = 0;

  // ν΄λ‘œμ €
  return function () {
    // 카운트 μƒνƒœλ₯Ό 1만큼 증가 μ‹œν‚¨λ‹€.
    return ++num;
  };
}());

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3

λ‹€μŒμ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν΄λ‘œμ €λ₯Ό ν™œμš©ν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ œλ‹€.

// ν•¨μˆ˜λ₯Ό 인수둜 전달받고 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜
// 이 ν•¨μˆ˜λŠ” 카운트 μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ 자유 λ³€μˆ˜ 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

makerCounter ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν• λ•Œ λ°˜ν™˜λœ ν•¨μˆ˜λŠ” μžμ‹ λ§Œμ˜ λ…λ¦½λœ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ κ°–κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

// ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜
// 이 ν•¨μˆ˜λŠ” 카운트 μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ 자유 λ³€μˆ˜ 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;
}

// 보쑰 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ 호좜
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2

// 자유 λ³€μˆ˜λ₯Ό κ³΅μœ ν•œλ‹€.
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0

⭐ 24.5 정보화와 정보은닉

μΊ‘μŠν™”λŠ” 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν”„λ‘œνΌν‹°μ™€ ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” λ™μž‘μΈ λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬ΆλŠ”κ²ƒμ„ λ§ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 정보 은닉을 μ™„μ „ν•˜κ²Œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ 자유 λ³€μˆ˜λ₯Ό 톡해 private을 흉내 λ‚Ό μˆ˜λŠ” μžˆμ§€λ§Œ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ΄λ§ˆμ €λ„ λΆˆκ°€λŠ₯해진닀

⭐ 24.6 자주 λ°œμƒν•˜λŠ” μ‹€μˆ˜

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]()); // β‘‘
}

μœ„ for 문의 μ½”λ“œλΈ”λ‘ λ‚΄μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜ i λŠ” 블둝 레벨 μŠ€μ½”ν”„κ°€ μ•„λ‹Œ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— μ „μ—­λ³€μˆ˜μ΄λ‹€. λ”°λΌμ„œ λ°°μ—΄μ˜ μš”μ†Œλ‘œ μΆ”κ°€ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ „μ—­ λ³€μˆ˜ iλ₯Ό μ°Έμ‘°ν•˜μ—¬ 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]());
}

μœ„ μ˜ˆμ œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ νŠΉμ„±μœΌλ‘œ 인해 for 문의 λ³€μˆ˜ μ„ μ–Έλ¬Έμ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ μ „μ—­ λ³€μˆ˜κ°€ 되기 λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” ν˜„μƒμ΄λ‹€. ES6의 let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 이 같은 λ²ˆκ±°λ‘œμ›€μ΄ κΉ”λ”ν•˜κ²Œ ν•΄κ²°λœλ‹€.

const funcs = [];

for (let i = 0; i < 3; i++) {
  funcs[i] = function () { return i; };
}

for (let i = 0; i < funcs.length; i++) {
  console.log(funcs[i]()); // 0 1 2
}

constλ‚˜ let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 반볡문(forλ¬Έ, for ... in λ¬Έ, for ... of λ¬Έ, while λ¬Έ λ“±)은 μ½”λ“œ 블둝을 반볡 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ„ μƒμ„±ν•˜μ—¬ λ°˜λ³΅ν•  λ‹Ήμ‹œμ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό 마치 μŠ€λƒ…μˆμ„ μ°λŠ” 것 처럼 μ €μž₯ν•œλ‹€.

profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보