๐Ÿชด ์„ฑ์žฅ์ผ์ง€

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ ํ‚ค์›Œ๋“œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…

JavaScript ๋ฐ์ดํ„ฐ ํƒ€์ž…(remind)

  • ์›์‹œํ˜•: ์ˆซ์žํ˜•, ๋ฌธ์žํ˜•, ๋ถˆ๋ฆฐํ˜•, null, undefined, Symbol
  • ์ฐธ์กฐํ˜•: Object(๊ฐ์ฒด)

์›์‹œํ˜•์˜ ๋ถˆ๋ณ€์„ฑ: ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ํ•œ๋ฒˆ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’ ์ž์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
์ฐธ์กฐํ˜•์˜ ๊ฐ€๋ณ€์„ฑ: ๊ฐ์ฒด ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ(๋ณ€์ˆ˜) ์˜์—ญ์€ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ’์˜ ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

๋ถˆ๋ณ€๊ฐ์ฒด: ๊ฐ์ฒด์ด๋ฉด์„œ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ๋ณต์‚ฌํ•˜์˜€์„ ๋•Œ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

var cloneDeep = function (target) {
  result = {};

  if (typeof target === 'targetect' && target !== null) {
    for (var prop in target) {
      result[prop] = cloneDeep(target[prop]);
    }
  } else {
    result = target;
  }
  return result;
};

JavaScript ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(remind)

์‹คํ–‰ ์ปจํ…์ŠคํŠธ: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋กœ, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  1. VariableEnvironment
  • EnvironmentRecord(์ดˆ๊ธฐ๊ฐ’)
  • OuterEnvironmentReference(์ดˆ๊ธฐ๊ฐ’)
  1. LexicalEnvironment
  • EnvironmentRecord
  • OuterEnvironmentReference
  1. Thisbinding

EnvironmentRecord: ํ˜ธ์ด์ŠคํŒ…๊ณผ ๊ด€๋ จ OuterEnvironmentReference: ์Šค์ฝ”ํ”„ ์ฒด์ด๋‹๊ณผ ๊ด€๋ จ

JavaScript This(remind)

This: ํŠน์ • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ˜•์„ฑ๋  ๋•Œ, ํŠน์ • ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŠน๋ณ„ํ•œ ๊ฐ์ฒด

๊ทธ๋ƒฅ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋  ๋•Œ๋Š” ์ „์—ญ๊ฐ์ฒด(window)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, ์–ด๋–ค ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋กœ์„œ ํ˜ธ์ถœ๋  ๋•Œ๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
๋˜ํ•œ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜•์„ฑ ์‹œ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด

์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋งˆ๋‹ค ์ง€์ •ํ•˜๋Š” this๊ฐ€ ์ œ๊ฐ๊ฐ

ํŠน์ • ๊ฐ์ฒด๋ฅผ this๋กœ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” call, apply, bind๊ฐ€ ์žˆ์Œ

ES6์—์„œ ์ถ”๊ฐ€๋œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ this binding ๊ณผ์ •์ด ๋น ์ ธ์žˆ์Œ

var obj = {
  name: 'jay',
  do: function () {
    console.log(this);
    var arrow = () => {
      console.log(this);
    };
    arrow(); // ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ–ˆ์Œ์—๋„ this๊ฐ€ window๊ฐ€ ์•„๋‹Œ obj๋ฅผ ๊ฐ€๋ฆฌํ‚ด(์Šค์ฝ”ํ”„ ์ฒด์ด๋‹์ฒ˜๋Ÿผ)
  },
};

JavaScript ์ฝœ๋ฐฑํ•จ์ˆ˜(remind)

์ฝœ๋ฐฑํ•จ์ˆ˜: ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ž‘์šฉํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ทธ ์ œ์–ด๊ถŒ์„ ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ ๋„˜๊ธฐ๊ฒŒ ๋จ

๋ณดํ†ต ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ ex) setTimeout, addEventListener ๋“ฑ

๐ŸŒŸ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ด€๋ จ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์€ ์‚ฌํ•ญ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ๋กœ ๋™๊ธฐ์ฒ˜๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•œ๋ฐ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ• ๊นŒ?

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ํ™˜๊ฒฝ(Web, Node ๋“ฑ๋“ฑ)์—์„œ ์ œ๊ณตํ•˜๋Š” API๋“ค์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„ ์ผ์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ Task Queue๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ด๋™ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ฝœ ์Šคํƒ์ด ๋ชจ๋‘ ๋น„์–ด์กŒ์„ ๋•Œ ์ด๋ฒคํŠธ๋ฃจํ”„๊ฐ€ ํ…Œ์Šคํฌ ํ์˜ ํ•จ์ˆ˜๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ๋„˜๊ฒจ์ฃผ์–ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

JavaScript ํด๋กœ์ €(remind)

ํด๋กœ์ €: ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€๋กœ ์ „๋‹ฌ๋˜์–ด ํ˜ธ์ถœ๋  ๋•Œ, ๊ทธ ๋ณ€์ˆ˜๊ฐ€ G.C(Garbage Collector)์— ์˜ํ•ด ์ˆ˜๊ฑฐ๋˜์ง€ ์•Š๊ณ  ๋‚จ์•„์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ
์™ธ๋ถ€๋กœ ์ „๋‹ฌ: return ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋“ฑ์„ ํ†ตํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ „๋‹ฌ ๋˜ํ•œ ํฌํ•จ๋œ๋‹ค.

ํด๋กœ์ €๋Š” ํ•˜๋‚˜์˜ ํ˜„์ƒ์ด์ง€๋งŒ, ์ˆ˜๊ฑฐ๋˜์–ด์•ผํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๊ณ ์ฐจํ•จ์ˆ˜(ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•œ ํด๋กœ์ € ํ™œ์šฉ๋ฒ•

var outer = function (value) {
  return function () {
    console.log(value + 'hi, there'); // return๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ outer์˜ value๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ํด๋กœ์ € ํ˜„์ƒ
  };
};

ํด๋กœ์ € ํ™œ์šฉ

  • ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด(์ •๋ณด ์€๋‹‰)
// ์ง์ ‘ a, b, c์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Œ(๋ณด์•ˆ ๊ฐ•ํ™”)
var security = function () {
  var a = 123;
  var b = 234;
  var c = 345;
  return {
    a_ref: a + 111;
    b_ref: b + 222;
    c_ref: c + 333;
  }
}
  • ๋ถ€๋ถ„ ์ ์šฉ ํ•จ์ˆ˜
  • ์ปค๋ง ํ•จ์ˆ˜
var curry = function (func) {
  return function (a) {
    return function (b) {
      return function (c) {
        return func(a, b, c);
      };
    };
  };
};

var curryArrow = (func) => (a) => (b) => (c) => func(a, b, c);