ν΄λ‘œμ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ κ°€μ§€κ³  μžˆλŠ” 2κ°€μ§€ νŠΉμ§• λ•Œλ¬Έμ— λ§Œλ“€μ–΄μ§„ μš©μ–΄μ΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μžμ²΄λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜λ₯Ό 객체둜 λ§Œλ“€μ–΄μ„œ κ·Έ μžμ²΄κ°€ μ •μ˜λ‹€! λΌκ³ ν•œλ‹€(?)

ν•¨μˆ˜λ₯Ό 객체둜 λ§Œλ“€κΈ° λ•Œλ¬Έμ— κ·Έ 객체 μžμ²΄κ°€ λ°˜ν™˜ 될 μˆ˜λ„ 있고 ν•¨μˆ˜κ°€ ν•¨μˆ˜ μ•ˆμ—μ„œ λ§Œλ“€μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€.

κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ ν•¨μˆ˜κ°€ κ°€μ§€κ³  μžˆλŠ” μ§€μ—­λ³€μˆ˜μ— λŒ€ν•œ λ¬Έμ œκ°€ ν΄λ‘œμ €λΌλŠ” 것을 λ‚³κ²Œ 됐닀.

λŠ” λ‰΄λ ‰μŒ€μ˜ 말

μ°Έμ‘° : https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures#ν΄λ‘œμ €closure

function makeAdder(x){
	var y = 1;

	return function(z){  // ν΄λ‘œμ €
		y = 100;
		return x + y + z;
	}
}

var add5 = makeAdder(5);  // ν•¨μˆ˜λ₯Ό μ°Έμ‘° => λ§€κ°œλ³€μˆ˜ x에 인자 5을 λŒ€μž…
var add10 = makeAdder(10);  // ν•¨μˆ˜λ₯Ό μ°Έμ‘° x = 10 => λ§€κ°œλ³€μˆ˜ x에 인자 10을 λŒ€μž…
// ν΄λ‘œμ €μ— x와 y의 ν™˜κ²½μ΄ μ €μž₯됨

console.log(add5(2));  // 107 (x:5 + y:100 + z:2) => x의 값이 μ‚΄μ•„μžˆλŠ” μƒνƒœμ—μ„œ z값을 λŒ€μž…
console.log(add10(2));  // 112 (x:10 + y:100 + z:2)

// (?)
console.log(makeAdder(5)(2)); // 107둜 동일 (?)

μžκΈ°κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” μžμ›μ„ λ‹«μ„μˆ˜ 있게 ν•΄μ£ΌλŠ” μœ μΌν•œ ν‚€μ›Œλ“œλ‹€ 라고 ν•΄μ„œ ν΄λ‘œμ €λΌκ³  ν•œλ‹€.

이런 ν΄λ‘œμ €λ‘œ μΈν•΄μ„œ μžμ›μ΄ 계속 λ¬Άμ΄λŠ” 일이 λ°œμƒν•  수 μžˆλŠ”λ°, 이 μžμ›μ„ μ•Œκ³  λ¬ΆλŠ”κ²ƒκ³Ό λͺ¨λ₯΄κ³  λ¬ΆλŠ”κ²ƒμ€ λ‹€λ₯΄λ‹€.

ν΄λ‘œμ €κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν”„λ‘œκ·Έλž¨μ„ 잘 λ§Œλ“€κ±°λ‚˜, μΌλΆ€λŸ¬ ν΄λ‘œμ €λ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.

ES5μ„œ ν”„λ‘œν† νƒ€μž…μ— μ˜ν•œ 객체지ν–₯이 μ΄λ€„μ§€λŠ”λ° μ΄λ•Œ μΌλΆ€λŸ¬ ν΄λ‘œμ €λ₯Ό λ§Œλ“€κ²Œ λœλ‹€. λ‚˜μ€‘μ— λ°°μšΈκ²ƒ