Skip to content

Latest commit

Β 

History

History
366 lines (282 loc) Β· 13.2 KB

File metadata and controls

366 lines (282 loc) Β· 13.2 KB

12.6 참쑰에 μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½

μ°Έμ‘° 11μž₯

// λ§€κ°œλ³€μˆ˜ primitiveλŠ” μ›μ‹œ 값을 전달받고, λ§€κ°œλ³€μˆ˜ objλŠ” 객체λ₯Ό μ „λ‹¬λ°›λŠ”λ‹€.
function changeVal(primitive, obj) {
  primitive += 100;
  obj.name = 'Kim';
}

// μ™ΈλΆ€ μƒνƒœ
var num = 100;
var person = { name: 'Lee' };

console.log(num); // 100
console.log(person); // {name: "Lee"}

// μ›μ‹œ 값은 κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜κ³  κ°μ²΄λŠ” μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€.
changeVal(num, person);

// μ›μ‹œ 값은 원본이 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€.
console.log(num); // 100

// κ°μ²΄λŠ” 원본이 ν›Όμ†λœλ‹€.
console.log(person); // {name: "Kim"}
  • λ§€κ°œλ³€μˆ˜λŠ” νƒ€μž…μ— 따라 값에 μ˜ν•œ 전달, 참쑰에 μ˜ν•œ 전달 방식을 λ”°λ₯Έλ‹€.

deepdive 12-33 (1)

  • 이처럼 μ™ΈλΆ€ μƒνƒœ person에 μ˜ν•΄ 원본이 νŒŒκ΄΄κ°€ λ˜λŠ” μƒνƒœ λ³€ν™”κ°€ μΌμ–΄λ‚˜λ©΄ μΆ”μ ν•˜κΈ°κ°€ μ–΄λ €μ›Œμ§„λ‹€. β†’ μ½”λ“œμ˜ λ³΅μž‘μ„± 증가, 가독성을 ν•΄μΉœλ‹€ / 논리가 간단해야 버그가 μΌμ–΄λ‚˜μ§€μ•Šκ³  μ°ΎκΈ°κ°€ 쉽닀.
  • 객체의 변경을 μΆ”μ ν•˜λ €λ©΄ μ˜΅μ €λ²„ νŒ¨ν„΄ 등을 톡해 λ³€κ²½ 사싀을 ν†΅μ§€ν•˜κ³  이에 λŒ€μ²˜ν•˜λŠ” μΆ”κ°€ λŒ€μ‘μ΄ ν•„μš”ν•˜λ‹€.
  • 또 λ‹€λ₯Έ 방법 λΆˆλ³€ 객체둜 λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” 것 β†’ 객체λ₯Ό 마치 μ›μ‹œκ°’μ²˜λŸΌ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ§Œλ“œλŠ” 것 예) μŠ€ν”„λ ˆλ“œλ¬Έλ²•, 원본은 κ·ΈλŒ€λ‘œ μƒˆλ‘œμš΄ 객체 λ§Œλ“€κΈ°

12.7 λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ

12.7.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

  • ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜
  • 단 ν•œλ²ˆλ§Œ 호좜되며 μž¬ν˜ΈμΆœν•  수 μ—†λ‹€
// 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function () {
  var a = 3;
  var b = 5;
  return a * b;
}());
// κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function foo() {
  var a = 3;
  var b = 5;
  return a * b;
}());

foo(); // ReferenceError: foo is not defined
  • 읡λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 일반적, κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ„ μ‚¬μš© κ°€λŠ₯
  • κ·Έλ£Ή μ—°μ‚°μž ( ) λ‚΄μ˜ κΈ°λͺ… ν•¨μˆ˜λŠ” ν•¨μˆ˜ 선언문이 μ•„λ‹Œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ 평가
  • ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžμ΄λ―€λ‘œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€.
function () { // SyntaxError: Function statements require a function name
  // ...
}();
  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ κ·Έλ£Ή μ—°μ‚°μž ( ) 둜 κ°μ‹Έμ•Όν•œλ‹€. μ•ˆκ·ΈλŸ¬λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€. β†’ ν•¨μˆ˜ μ„ μ–Έλ¬Έμ˜ ν˜•μ‹μ— λ§žμ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.
function foo() {
  // ...
}(); // SyntaxError: Unexpected token ')'
  • μœ„ 처럼 κ·Έλ£Ή μ—°μ‚°μž 없이 κΈ°λͺ… ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄λ„ 였λ₯˜κ°€ λ‚œλ‹€. β†’ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•”λ¬΅μ μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” μ„Έλ―Έμ½œλ‘  μžλ™ μ‚½μž… κΈ°λŠ₯에 μ˜ν•΄ ν•¨μˆ˜ 선언문이 λλ‚˜λŠ” μœ„μΉ˜, ν•¨μˆ˜ μ½”λ“œ λΈ”λ‘μ˜ λ‹«λŠ” μ€‘κ΄„ν˜Έ 뒀에 β€œ;” 이 μ•”λ¬΅μ μœΌλ‘œ μΆ”κ°€κ°€ 되기 λ•Œλ¬Έμ΄λ‹€.
function foo() {}(); // => function foo() {};();
  • λ”°λΌμ„œ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 뒀에 ( ) λŠ” ν•¨μˆ˜ ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹Œ κ·Έλ£Ή μ—°μ‚°μžλ‘œ ν•΄μ„λ˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
console.log(typeof (function f(){})); // function
console.log(typeof (function (){}));  // function
  • κ·Έλ£Ή μ—°μ‚°μžλ‘œ 묢은 μ΄μœ λŠ” λ¨Όμ € ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ ν‰κ°€ν•΄μ„œ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.
  • 보톡 첫번째 방식을 많이 μ‚¬μš©ν•œλ‹€.
// μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ„ 일반 ν•¨μˆ˜μ²˜λŸΌ 값을 λ°˜ν™˜ν•  수 μžˆλ‹€.
var res = (function () {
  var a = 3;
  var b = 5;
  return a * b;
}());

console.log(res); // 15

// μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ—λ„ 일반 ν•¨μˆ˜μ²˜λŸΌ 인수λ₯Ό 전달할 수 μžˆλ‹€.
res = (function (a, b) {
  return a * b;
}(3, 5));

console.log(res); // 15
  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ„ 일반 ν•¨μˆ˜μ²˜λŸΌ 값을 λ°˜ν™˜ν•  수 있고 인수λ₯Ό 전달할 수 μžˆλ‹€.

12.7.2 μž¬κ·€ ν•¨μˆ˜

  • ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ 호좜이라고 ν•œλ‹€.
  • 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν–‰μœ„, 즉 μž¬κ·€ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
  • μž¬κ·€ ν•¨μˆ˜λŠ” λ°˜λ³΅λ˜λŠ” 처리λ₯Ό μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

- 10λΆ€ν„° 0κΉŒμ§€ 좜λ ₯ν•˜λŠ” ν•¨μˆ˜
function countdown(n) {
  for (var i = n; i >= 0; i--) console.log(i);
}

countdown(10);
  • λ°˜λ³΅λ¬Έμ—†μ΄ κ΅¬ν˜„ν•  수 μžˆλŠ” 방법이 λ°”λ‘œ β€œμž¬κ·€ ν•¨μˆ˜β€
function countdown(n) {
  if (n < 0) return;
  console.log(n);
  countdown(n - 1); // μž¬κ·€ 호좜
}

countdown(10);
  • νŒ©ν† λ¦¬μ–Ό ν•¨μˆ˜
    • 1λΆ€ν„° 자기 μžμ‹ κΉŒμ§€μ˜ λͺ¨λ“  μ–‘μ˜ μ •μˆ˜μ˜ 곱을 ν•˜λŠ” ν•¨μˆ˜
// νŒ©ν† λ¦¬μ–Ό(κ³„μŠΉ)은 1λΆ€ν„° μžμ‹ κΉŒμ§€μ˜ λͺ¨λ“  μ–‘μ˜ μ •μˆ˜μ˜ 곱이닀.
// n! = 1 * 2 * ... * (n-1) * n
function factorial(n) {
  // νƒˆμΆœ 쑰건: n이 1 μ΄ν•˜μΌ λ•Œ μž¬κ·€ ν˜ΈμΆœμ„ λ©ˆμΆ˜λ‹€.
  if (n <= 1) return 1;
  // μž¬κ·€ 호좜
  return n * factorial(n - 1);
}

console.log(factorial(0)); // 0! = 1
console.log(factorial(1)); // 1! = 1
console.log(factorial(2)); // 2! = 2 * 1 = 2
console.log(factorial(3)); // 3! = 3 * 2 * 1 = 6
console.log(factorial(4)); // 4! = 4 * 3 * 2 * 1 = 24
console.log(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120
  • μž¬κ·€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ¬΄ν•œ μž¬κ·€ ν˜ΈμΆœν•œλ‹€. κ·Έλž˜μ„œ ν•¨μˆ˜ λ‚΄μ—λŠ” μž¬κ·€ ν˜ΈμΆœμ„ 멈좜 수 μžˆλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. β†’ νƒˆμΆœ 쑰건이 μ—†μœΌλ©΄ ν•¨μˆ˜κ°€ λ¬΄ν•œ 호좜, βš οΈμŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ—λŸ¬ λ°œμƒ
  • μž¬κ·€ ν•¨μˆ˜λŠ”forλ¬Έμ΄λ‚˜ while 문으둜 κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€.
  • 반볡문 없이 κ΅¬ν˜„ν•  수 μžˆλ‹€λŠ” μž₯점
  • λ¬΄ν•œ λ°˜λ³΅μ— 빠질 μœ„ν—˜, μŠ€νƒ μ˜€λ²„ν”Œλ‘œ μ—λŸ¬ λ°œμƒν•  수 μžˆλŠ” 단점이 μžˆμ–΄ μ£Όμ˜ν•΄μ„œ μ‚¬μš©
  • 즉, λ°˜λ³΅λ¬Έλ³΄λ‹€λŠ” μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 μ§κ΄€μ μœΌλ‘œ μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ λ•Œλ§Œ ν•œμ •μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§

12.7.3 쀑첩 ν•¨μˆ˜ (λ‚΄λΆ€ ν•¨μˆ˜)

  • ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜
  • 쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.
  • μžμ‹ μ„ ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜μ˜ μ—­ν• 
function outer() {
  var x = 1;

  // 쀑첩 ν•¨μˆ˜
  function inner() {
    var y = 2;
    // μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
    console.log(x + y); // 3
  }

  inner();
}

outer();

12.7.4 콜백 ν•¨μˆ˜

// n만큼 μ–΄λ–€ 일을 λ°˜λ³΅ν•œλ‹€.
function repeat1(n) {
  // iλ₯Ό 좜λ ₯ν•œλ‹€.
  for (var i = 0; i < n; i++) console.log(i);
}

repeat1(5); // 0 1 2 3 4

// n만큼 μ–΄λ–€ 일을 λ°˜λ³΅ν•œλ‹€.
function repeat2(n) {
  for (var i = 0; i < n; i++) {
    // iκ°€ ν™€μˆ˜μΌ λ•Œλ§Œ 좜λ ₯ν•œλ‹€.
    if (i % 2) console.log(i);
  }
}

repeat2(5); // 1 3
  • repeat1ν•¨μˆ˜μ™€ repeat2의 ν•¨μˆ˜λŠ” 곡톡적인 둜직이 μ‘΄μž¬ν•œλ‹€.
  • ν•¨μˆ˜ ν•©μ„± β†’ λ³€ν•˜μ§€ μ•ŠλŠ” 곡톡 λ‘œμ§μ€ 미리 μ •μ˜ν•΄λ‘κ³  κ²½μš°μ— 따라 λ³€κ²½λ˜λŠ” λ‘œμ§μ€ μΆ”μƒν™”ν•΄μ„œ ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œ μ „λ‹¬ν•˜λŠ” 것
// μ™ΈλΆ€μ—μ„œ 전달받은 fλ₯Ό n만큼 반볡 ν˜ΈμΆœν•œλ‹€.
function repeat(n, f) {
  for (var i = 0; i < n; i++) {
    f(i); // iλ₯Ό μ „λ‹¬ν•˜λ©΄μ„œ fλ₯Ό 호좜
  }
}

var logAll = function (i) {
  console.log(i);
};

// 반볡 ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬ν•œλ‹€.
repeat(5, logAll); // 0 1 2 3 4

var logOdds = function (i) {
  if (i % 2) console.log(i);
};

// 반볡 ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬ν•œλ‹€.
repeat(5, logOdds); // 1 3
  • 이처럼 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ 내뢀에 μ „λ‹¬λ˜λŠ” ν•¨μˆ˜ β†’ 콜백 ν•¨μˆ˜
  • 맀개 λ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ 콜백 ν•¨μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜ β†’ κ³ μ°¨ ν•¨μˆ˜ repeat
  • 쀑첩 ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜μ˜ μ—­ν• , 콜백 ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜μ˜ μ—­ν• 
  • 단, 쀑첩 ν•¨μˆ˜λŠ” κ³ μ •λ˜μ–΄ μžˆμ–΄μ„œ κ΅μ²΄ν•˜κΈ° κ³€λž€ν•˜μ§€λ§Œ 콜백 ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ κ³ μ°¨ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ£Όμž…ν•˜κΈ° λ•Œλ¬Έμ— 자유둭게 ꡐ체가λŠ₯ν•˜λ‹€. β†’ κ³ μ°¨ ν•¨μˆ˜λŠ” 콜백 ν•¨μˆ˜λ₯Ό μžμ‹ μ˜ μΌλΆ€λΆ„μœΌλ‘œ ν•©μ„±
  • κ³ μ°¨ ν•¨μˆ˜λŠ” 맀개 λ³€μˆ˜λ₯Ό 톡해 전달받은 콜백 ν•¨μˆ˜μ˜ 호좜 μ‹œμ μ„ κ²°μ •ν•΄μ„œ ν˜ΈμΆœν•œλ‹€.
// 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ 콜백 ν•¨μˆ˜λ‘œ κ³ μ°¨ ν•¨μˆ˜μ— μ „λ‹¬ν•œλ‹€.
// 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ repeat ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€.
repeat(5, function (i) {
  if (i % 2) console.log(i);
}); // 1 3
  • 콜백 ν•¨μˆ˜κ°€ κ³ μ°¨ ν•¨μˆ˜ λ‚΄λΆ€μ—λ§Œ ν˜ΈμΆœλœλ‹€λ©΄ 콜백 ν•¨μˆ˜λŠ” 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μ •μ˜ν•˜λ©΄μ„œ κ³§λ°”λ‘œ μ „λ‹¬ν•˜λŠ” 것이 일반적
  • μ΄λ•Œ 콜백 ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ λ•Œλ§ˆλ‹€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό 생성 β†’ κ·Έλž˜μ„œ μž¬μ‚¬μš©λ  κ°€λŠ₯성이 μžˆλ‹€λ©΄ μ™ΈλΆ€μ—μ„œ μ •μ˜ν•˜λŠ” 것이 효율적
// 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 이벀트 처리
// myButton λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 콜백 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.
document.getElementById('myButton').addEventListener('click', function () {
  console.log('button clicked!');
});

// 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œ 비동기 처리
// 1초 후에 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.
setTimeout(function () {
  console.log('1초 경과');
}, 1000);
  • 콜백 ν•¨μˆ˜λŠ” 비동기 μ²˜λ¦¬μ— ν™œμš©λ˜λŠ” μ€‘μš”ν•œ νŒ¨ν„΄
// 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜ map
var res = [1, 2, 3].map(function (item) {
  return item * 2;
});

console.log(res); // [2, 4, 6]

// 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜ filter
res = [1, 2, 3].filter(function (item) {
  return item % 2;
});

console.log(res); // [1, 3]

// 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜ reduce
res = [1, 2, 3].reduce(function (acc, cur) {
  return acc + cur;
}, 0);

console.log(res); // 6
  • 콜백 ν•¨μˆ˜λŠ” λ°°μ—΄ κ³ μ°¨ ν•¨μˆ˜μ—μ„œλ„ μ‚¬μš©

12.7.5 순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

  • 순수 ν•¨μˆ˜
    • μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ”, 즉 λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜
    • λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
var count = 0; // ν˜„μž¬ 카운트λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ

// 순수 ν•¨μˆ˜ increaseλŠ” λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•œλ‹€.
function increase(n) {
  return ++n;
}

// 순수 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ 결과값을 λ³€μˆ˜μ— μž¬ν• λ‹Ήν•΄μ„œ μƒνƒœλ₯Ό λ³€κ²½
count = increase(count);
console.log(count); // 1

count = increase(count);
console.log(count); // 2
  • λΉ„μˆœμˆ˜ ν•¨μˆ˜
    • μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”, 즉 λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν•¨μˆ˜
    • μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ν•¨μˆ˜
var count = 0; // ν˜„μž¬ 카운트λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ: increase ν•¨μˆ˜μ— μ˜ν•΄ λ³€ν™”ν•œλ‹€.

// λΉ„μˆœμˆ˜ ν•¨μˆ˜
function increase() {
  return ++count; // μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜λ©° μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•œλ‹€.
}

// λΉ„μˆœμˆ˜ ν•¨μˆ˜λŠ” μ™ΈλΆ€ μƒνƒœ(count)λ₯Ό λ³€κ²½ν•˜λ―€λ‘œ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.
increase();
console.log(count); // 1

increase();
console.log(count); // 2

"πŸ’‘ ν•¨μˆ˜κ°€ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ©΄ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€. λ”°λΌμ„œ ν•¨μˆ˜ μ™ΈλΆ€ μƒνƒœμ˜ 변경을 μ§€μ–‘ν•˜λŠ” μˆœμˆ˜ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€."

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ μ§€ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€. κ²°κ΅­ 순수 ν•¨μˆ˜λ₯Ό 톡해 λΆ€μˆ˜ 효과λ₯Ό μ΅œλŒ€ν•œ μ–΅μ œν•΄ 였λ₯˜λ₯Ό ν”Όν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ „μ„±μ„ λ†’μ΄λ €λŠ” λ…Έλ ₯의 μΌν™˜μ΄λ‹€.

11μž₯ μ›μ‹œκ°’κ³Ό 객체의 비ꡐ

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” 7κ°€μ§€ 데이터 νƒ€μž…(숫자, λ¬Έμžμ—΄, λΆˆλ¦¬μ–Έ, null, undefined, μ‹¬λ²Œ, 객체 νƒ€μž…)은 크게 μ›μ‹œ νƒ€μž…κ³Ό 객체 νƒ€μž…μœΌλ‘œ ꡬ뢄 κ°€λŠ₯
μ›μ‹œ νƒ€μž… 객체 νƒ€μž…
λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’ λ³€κ²½ κ°€λŠ₯ν•œ κ°’
λ³€μˆ˜μ—λŠ” μ‹€μ œκ°’ μ €μž₯ λ³€μˆ˜μ—λŠ” μ°Έμ‘°κ°’ μ €μž₯
λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ›μ‹œκ°’μ΄ λ³΅μ‚¬λ˜μ–΄ 전달 λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ 전달
값에 μ˜ν•œ 전달 참쑰에 μ˜ν•œ 전달

μ˜΅μ €λ²„ νŒ¨ν„΄

  • **μ˜΅μ €λ²„ νŒ¨ν„΄(observer pattern)**μ€Β κ°μ²΄μ˜ μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•˜λŠ” κ΄€μ°°μžλ“€, 즉 μ˜΅μ €λ²„λ“€μ˜ λͺ©λ‘μ„ 객체에 λ“±λ‘ν•˜μ—¬ μƒνƒœ λ³€ν™”κ°€ μžˆμ„ λ•Œλ§ˆλ‹€ λ©”μ„œλ“œ 등을 톡해 객체가 직접 λͺ©λ‘μ˜ 각 μ˜΅μ €λ²„μ—κ²Œ ν†΅μ§€ν•˜λ„λ‘ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.