8. ν•¨μˆ˜ (8.1~7)

WoogieΒ·2022λ…„ 10μ›” 18일
0
post-thumbnail

8.1 ν•¨μˆ˜ μ •μ˜ν•˜κΈ°πŸ‘Š


8.1.1 ν•¨μˆ˜ μ •μ˜ 방법

  1. ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•˜λŠ” 방법
function square(x) {
  return x * x;
}
  1. ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μ •μ˜ν•˜λŠ” 방법
var square = function (x) {
  return x * x;
};
  1. Function μƒμ„±μžλ‘œ μ •μ˜ν•˜λŠ” 방법
var square = new Function("x", "return x*x");
  1. ν™”μ‚΄ν‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•˜λŠ” 방법
var square = (x) => x * x;

ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” 호좜문이 그보닀 μ•žμ— μœ„μΉ˜ν•΄λ„ ν˜ΈμΆœν•  수 μžˆλ‹€.
(ν˜Έμ΄μŠ€νŒ… 적용)

console.log(hoisting(5));
function hoisting(x) {
  return x * x;
}

λ‹€λ₯Έ 방법듀은 μ—λŸ¬κ°€ λ‚œλ‹€. (ν˜Έμ΄μŠ€νŒ… λΉ„μ μš©)

<μ—λŸ¬>
console.log(noHoisting(3));
var noHoisting = function (x) {
  return x * x;
};
var noHoisting = new Function("x", "return x*x");
var noHoisting = (x) => x * x;

8.2.1 쀑첩 ν•¨μˆ˜

νŠΉμ •ν•¨μˆ˜μ˜ 내뢀에 μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό κ°€λ¦¬μΌœ κ·Έ ν•¨μˆ˜μ˜ 쀑첩 ν•¨μˆ˜λΌκ³  ν•œλ‹€.

λ°°μ—΄ μš”μ†Œμ˜ μ œκ³±ν•©μ— λŒ€ν•œ μ œκ³±κ·Όμ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜

function norm(x) {
  var sum2 = sumSquare();
  return Math.sqrt(sum2);
  function sumSquare() {
    sum = 0;
    for (var i = 0; i < x.length; i++) sum += x[i] * x[i];
    return sum;
  }
}
var a = [2, 1, 3, 5, 7];
var n = norm(a);
console.log(n);

8.2 ν•¨μˆ˜ ν˜ΈμΆœν•˜κΈ°πŸ‘Š


8.2.1 ν•¨μˆ˜ 호좜 방법

  1. ν•¨μˆ˜ 호좜
var s = square();
  1. λ©”μ„œλ“œ 호좜
obj.m = function () {
  console.log("hi");
};
obj.m();
  1. μƒμ„±μž 호좜
var obj = new Object();
  1. call, applyλ₯Ό μ‚¬μš©ν•œ κ°„μ ‘ 호좜
var example = function (a, b, c) {
  return a + b + c;
};
example(1, 2, 3);
example.call(null, 1, 2, 3);    // null = this
example.apply(null, [1, 2, 3]); // null = this

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

var f = function () {
  console.log("hello");
};
f();

κ·Έ μ™Έ 방법 1. //잘 쓰이진 μ•ŠλŠ”λ‹€.

(function (a, b) {
  console.log(`hi1 / a = ${a} / b = ${b}`);
})(1, 2);

κ·Έ μ™Έ 방법 2. //잘 쓰이진 μ•ŠλŠ”λ‹€.

(function () {
  console.log("hi2");
})();

8.3 ν•¨μˆ˜μ˜ μΈμˆ˜πŸ‘Š


8.3.1 인수의 μƒλž΅

ν•¨μˆ˜ μ •μ˜μ‹μ— μž‘μ„±λœ 인자 κ°œμˆ˜λ³΄λ‹€ 인수λ₯Ό 적게 μ „λ‹¬ν•΄μ„œ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄
μΈμˆ˜μ—μ„œ μƒλž΅ν•œ μΈμžλŠ” undefinedκ°€ λœλ‹€.

function f(x, y) {
  console.log(x, y);
}
f(2);
// x = 2, y = undefined

μœ„μ˜ μ„±μ§ˆμ„ ν™œμš©ν•˜μ—¬ 인수λ₯Ό μƒλž΅ν•œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

function multiply(a, b) {
  b = b || 5;	// μ΄ˆκΉƒκ°’ μ„€μ • (μ™Όμͺ½ ν”Όμ—°μ‚°μžκ°€ trueλ©΄ μ™Όμͺ½ λ°˜ν™˜, falseλ©΄ 였λ₯Έμͺ½ λ°˜ν™˜)
  console.log(a * b);
}
multiply(2, 3);	// (2*3) = 6
multiply(2);	// (2*5) = 10

8.3.2 κ°€λ³€ 길이 인수 λͺ©λ‘

λͺ¨λ“  ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ§€μ—­λ³€μˆ˜λ‘œλŠ” μœ μ‚¬ λ°°μ—΄ 객체인 argumentsκ°€ μžˆλ‹€.

arguments[0];	  // 첫번째 인수 κ°’
arguments[1];     //λ‘λ²ˆμ§Έ 인수 κ°’
arguments[n - 1]; // n번째 μΈμˆ˜κ°’

arguments.length  //인수 개수
arguments.callee  //μ‹€ν–‰λ˜κ³  μžˆλŠ” ν•¨μˆ˜μ˜ μ°Έμ‘°

function arg(x, y) {
  arguments[1] = 3;
  console.log(
    `x = ${x}, y = ${y},
    arguments length is ${arguments.length},
    arguments callee ${arguments.callee}`
  );
}
arg(1, 2);

μœ„ ν•¨μˆ˜ μ‹€ν–‰ κ²°κ³Ό βœ”
arguments.calleeκ°€ ν•¨μˆ˜ 전체λ₯Ό κ°€μ Έμ˜¨ κ±Έ 확인 ν•  수 μžˆλ‹€.

x = 1, y = 3,
    arguments length is 2,
    arguments callee function arg(x, y) {
  arguments[1] = 3;
  console.log(
    `x = ${x}, y = ${y},
    arguments length is ${arguments.length},
    arguments callee ${arguments.callee}`
  );
}

8.4 μž¬κ·€ν•¨μˆ˜πŸ‘Š


8.4.1 μž¬κ·€ ν•¨μˆ˜μ˜ κΈ°λ³Έ

ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν–‰μœ„λ₯Ό μž¬κ·€ν˜ΈμΆœ μž¬κ·€ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€ν•¨μˆ˜ 라고 ν•œλ‹€.
μž¬κ·€ν•¨μˆ˜μ˜ λŒ€ν‘œμ μΈ μ˜ˆμ œλ‘œλŠ” νŒ©ν† λ¦¬μ–Όμ΄ μžˆλ‹€.

function fact1(n) {
  if (n <= 1) return 1;
  return n * fact1(n - 1);
}
console.log(fact1(5));

arguments.callee μ‚¬μš© μ½”λ“œ

var fact3 = function (n) {
  if (n <= 1) return 1;
  return n * arguments.callee(n - 1);
};
console.log(fact3(5));

μž¬κ·€ν•¨μˆ˜ 주의점 ❗

  • μž¬κ·€ ν˜ΈμΆœμ€ λ°˜λ“œμ‹œ λ©ˆμΆ°μ•Ό ν•œλ‹€.
    if(n <= 1) return 1;

  • μž¬κ·€ 호좜둜 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμ„λ•Œλ§Œ μ‚¬μš©ν•œλ‹€.

μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ ν•˜λ…Έμ΄νƒ‘ μ•Œκ³ λ¦¬μ¦˜ πŸ—Ό
function hanoi(n, a, b, c) {
  if (n < 1) return;
  hanoi(n - 1, a, c, b);
  console.log(`${n} 번째 μ›λ°˜ : ${a} -> ${c}`);
  hanoi(n - 1, b, a, c);
}
console.log(hanoi(3, "A", "B", "C"));

μœ„ ν•¨μˆ˜ μ‹€ν–‰ κ²°κ³Ό βœ”

1 번째 μ›λ°˜ : A -> C
2 번째 μ›λ°˜ : A -> B
1 번째 μ›λ°˜ : C -> B
3 번째 μ›λ°˜ : A -> C
1 번째 μ›λ°˜ : B -> A
2 번째 μ›λ°˜ : B -> C
1 번째 μ›λ°˜ : A -> C

μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ 퀡 μ •λ ¬ 예제
function quicksort(x, first, last) {
  var p = x[Math.floor((first + last) / 2)];
  for (var i = first, j = last; ; i++, j--) {
    while (x[i] < p) i++;
    while (p < x[j]) j--;
    if (i >= j) break;
    var w = x[i];
    x[i] = x[j];
    x[j] = w;
  }
  if (first < i - 1) {
    quicksort(x, first, i - 1);
  }
  if (j + 1 < last) {
    quicksort(x, j + 1, last);
  }
}
var a = [4, 7, 2, 5, 1, 8, 9, 3];
quicksort(a, 0, a.length - 1);
console.log(a);

8.5 ν”„λ‘œκ·Έλž¨ 평가와 μ‹€ν–‰ κ³Όμ •πŸ‘Š


8.5.1 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œ

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό λ§Œλ‚˜λ©΄ κ·Έ μ½”λ“œλ₯Ό ν‰κ°€ν•΄μ„œ μ‹€ν–‰ λ¬Έλ§₯으둜 λ§Œλ“ λ‹€.

μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œ

  • μ „μ—­ μ½”λ“œ (Window μ•„λž˜μ— μ •μ˜λœ ν•¨μˆ˜)
  • ν•¨μˆ˜ μ½”λ“œ (ν•¨μˆ˜)
  • eval μ½”λ“œ (λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ μ•„λ‹Œ λ³„λ„μ˜ 동적 ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— 쒋지 μ•Šμ€ μ½”λ“œ)

8.5.2 μ‹€ν–‰ λ¬Έλ§₯의 ꡬ성

μ‹€ν–‰ λ¬Έλ§₯은 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œκ°€ μ‹€μ œλ‘œ μ‹€ν–‰λ˜κ³  κ΄€λ¦¬λ˜λŠ” μ˜μ—­, μ»΄ν¬λ„ŒνŠΈ μ—¬λŸ¬ κ°œκ°€ λ‚˜λˆ„μ–΄ 관리

μ•„λž˜ μ½”λ“œλŠ” 객체 ν‘œν˜„μ„ 빌린 μ˜μ‚¬μ½”λ“œμž„

// μ‹€ν–‰ λ¬Έλ§₯
ExecutionContext {
    // λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈ
    LexicalEnvironment: {},
    //  λ³€μˆ˜ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈ
    VariableEnvironment: {},
    // λ””μŠ€ 바인딩 μ»΄ν¬λ„ŒνŠΈ
    ThisBinding : null,
}

8.5.3 λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈμ˜ ꡬ성

λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈμ™€ λ³€μˆ˜ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈλŠ” 같은 것이라 봐도 λ¬΄λ°©ν•˜λ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈ

  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μžμ›μ„ λͺ¨μ•„ λ‘” κ³³
  • ν•¨μˆ˜ λ˜λŠ” λΈ”λ‘μ˜ 유효 λ²”μœ„ μ•ˆμ— μžˆλŠ” μ‹λ³„μžμ™€ κ·Έ 결과값이 μ €μž₯λ˜λŠ” κ³³

μ•„λž˜ μ½”λ“œλŠ” 객체 ν‘œν˜„μ„ 빌린 μ˜μ‚¬μ½”λ“œμž„

// λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈ
LexicalEnvironment: {
    // ν™˜κ²½ λ ˆμ½”λ“œ
    EnvironmentRecord: {},
    // μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘°
    OuterLexicalEnvironment Reference: {}
}

ν™˜κ²½ λ ˆμ½”λ“œ - 유효 λ²”μœ„ μ•ˆμ— ν¬ν•¨λœ μ‹λ³„μžλ₯Ό κΈ°λ‘ν•˜κ³  μ‹€ν–‰ν•˜λŠ” μ˜μ—­

  • 선언적 ν™˜κ²½ λ ˆμ½”λ“œ - ν•¨μˆ˜μ™€ λ³€μˆ˜ catch문의 μ‹λ³„μžμ™€ μ‹€ν–‰ κ²°κ³Όκ°€ μ €μž₯λ˜λŠ” μ˜μ—­
  • 객체 ν™˜κ²½ λ ˆμ½”λ“œ - μ‹€ν–‰ λ¬Έλ§₯ 외뢀에 λ³„λ„λ‘œ μ €μž₯된 객체의 μ°Έμ‘°μ—μ„œ 데이터λ₯Ό μ½κ±°λ‚˜ 씀

μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘° - μ€‘μ²©λœ ν•¨μˆ˜ μ•ˆμ—μ„œ λ°”κΉ₯ μ½”λ“œμ— μ •μ˜λœ λ³€μˆ˜λ₯Ό μ½κ±°λ‚˜ 써야 ν•  λ•Œ κ·Έ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•˜λŠ” μ—­ν• 

8.5.4 μ „μ—­ ν™˜κ²½κ³Ό μ „μ—­ 객체의 생성

μžλ°”μŠ€ν¬λ¦½νŠΈ μΈν„°ν”„λ¦¬ν„°λŠ” μ‹œμž‘ν•˜μžλ§ˆμž λ ‰μ‹œμ»¬ ν™˜κ²½ νƒ€μž…μ˜ μ „μ—­ ν™˜κ²½μ„ μƒμ„±ν•œλ‹€.

// μ „μ—­ ν™˜κ²½
GlobalEnvironment = {
  ObjectEnvironmentRecord: {
    bindObject: window
    },
  OuterLexicalEnvironmentReference: null
}

// μ „μ—­ μ‹€ν–‰ λ¬Έλ§₯
ExecutionContext = {
  LexicalEnvironment: GlobalEnvironment,
  ThisBinding: window,
}

8.5.5 ν”„λ‘œκ·Έλž¨μ˜ 평가와 μ „μ—­ λ³€μˆ˜

μ „μ—­ ν™˜κ²½κ³Ό μ „μ—­ 객체λ₯Ό μƒμ„±ν•œ ν›„, ν”„λ‘œκ·Έλž¨μ„ 읽어 듀인닀. λ‹€ 읽어 듀인 ν›„μ—λŠ” ν”„λ‘œκ·Έλž¨μ„ ν‰κ°€ν•˜λ©° μ΅œμƒμœ„ λ ˆλ²¨μ— var문으둜 μž‘μ„±ν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ ν™˜κ²½μ˜ ν™˜κ²½ λ ˆμ½”λ“œμ˜ ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€λœλ‹€.

var a = { x: 1, y: 2 };
console.log(window.a);	// -> Object {x=1, y=2}

function norm(x) {
  return;
}
console.log(window.norm);	// -> norm(x)

μ΅œμƒμœ„ λ ˆλ²¨μ— μ„ μ–Έλœ λ³€μˆ˜μ™€ ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ„ ν‰κ°€ν•˜λŠ” μ‹œμ μ— ν™˜κ²½ λ ˆμ½”λ“œ(객체 ν™˜κ²½ λ ˆμ½”λ“œ)에 μΆ”κ°€λœλ‹€. 그리고 이미 객체 ν™˜κ²½ λ ˆμ½”λ“œμ— μΆ”κ°€λœ μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— μ½”λ“œμ˜ μ–΄λŠ μœ„μΉ˜μ— μž‘μ„±ν•΄λ„ 전체 ν”„λ‘œκ·Έλž¨μ΄ μ°Έμ‘° ν•  수 μžˆλ‹€. 이것이 λŒμ–΄μ˜¬λ¦Ό (Hoisting) ν˜„μƒμ˜ 싀체닀.

8.5.6 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰κ³Ό μ‹€ν–‰ λ¬Έλ§₯

ν”„λ‘œκ·Έλž¨μ΄ ν‰κ°€λœ λ‹€μŒ μ‹€ν–‰λ˜λŠ”λ°, ν”„λ‘œκ·Έλž¨μ€ μ‹€ν–‰ λ¬Έλ§₯ μ•ˆμ—μ„œ μ‹€ν–‰λœλ‹€. 그리고 μ‹€ν–‰ λ¬Έλ§₯은 μŠ€νƒκ΅¬μ‘°λ‘œ κ΄€λ¦¬λœλ‹€.

8.5.7 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ

μ‹±κΈ€μŠ€λ ˆλ“œ - ν”„λ‘œκ·Έλž¨ ν•œ 개의 처리 νλ¦„μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ 순차적으둜 μ‹€ν–‰
λ©€ν‹°μŠ€λ ˆλ“œ - ν”„λ‘œκ·Έλž¨ μ—¬λŸ¬ 개의 처리 νλ¦„μœΌλ‘œ λ™μ‹œμ— μž‘μ—…μ„ λ³‘λ ¬λ‘œ μ‹€ν–‰

8.5.8 this κ°’

ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄ μ‹€ν–‰λ˜λŠ” μ‹œμ μ— this값이 κ²°μ •λ˜λŠ”λ° 이 this 값은
ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ κ·Έ ν•¨μˆ˜κ°€ 속해 있던 객체의 μ°Έμ‘° 이닀.

var tom = {
  name: "Tom",
  sayHello: function () {
    console.log("Hello! " + this.name);	// Hello! Tom 좜λ ₯
  },
};
tom.sayHello();

λ‹€μŒμ€ λ‹€μ–‘ν•œ μƒν™©μ—μ„œ thisκ°€ μ–΄λ–€ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ”μ§€ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€.

  1. μ΅œμƒμœ„ 레벨 μ½”λ“œμ˜ this (μ „μ—­ 객체λ₯Ό 가리킨닀.)
    console.log(this); // -> Window
  2. 이벀트 처리기 μ•ˆμ— μžˆλŠ” this
  3. μƒμ„±μž ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” this
  4. μƒμ„±μžμ˜ prototype λ©”μ„œλ“œ μ•ˆμ— μžˆλŠ” this

8.5.9 μ‹λ³„μž κ²°μ • : 유효 λ²”μœ„ 체인

쀑첩 ν•¨μˆ˜μ™€ μ™ΈλΆ€ ν•¨μˆ˜ ν˜Ήμ€ μ „μ—­ μ½”λ“œμ—μ„œ 같은 이름을 가진 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 좩돌이 λ°œμƒν•œλ‹€.
μ΄λ•Œ λ³€μˆ˜ xκ°€ μ–΄λ””μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜μΈμ§€ κ²°μ •ν•˜λŠ” μž‘μ—…μ„ κ°€λ¦¬μΌœ λ³€μˆ˜ x의 μ‹λ³„μž κ²°μ • 이라고 ν•œλ‹€.
μ‹λ³„μž κ²°μ • κ·œμΉ™μ€ μ’€ 더 μ•ˆμͺ½ μ½”λ“œμ— μ„ μ–Έλœ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

var a = "A";
// λ‹«νžŒ ν•¨μˆ˜
function f() {
  var b = "B";
  // μ—΄λ¦° ν•¨μˆ˜
  function g() {
    var c = "C"; // 속박 λ³€μˆ˜
    console.log(a + b + c);
  }
  g();
}
f();

속박 λ³€μˆ˜ - 일반적인 ν•¨μˆ˜μ˜ μΈμˆ˜μ™€ 지역 λ³€μˆ˜
자유 λ³€μˆ˜ - κ·Έ μ™Έ λ³€μˆ˜
λ‹«νžŒ ν•¨μˆ˜ - 속박 λ³€μˆ˜λ§Œ ν¬ν•¨ν•œ ν•¨μˆ˜
μ—΄λ¦° ν•¨μˆ˜ - 자유 λ³€μˆ˜λ₯Ό 가지고 μžˆλŠ” ν•¨μˆ˜

8.5.10 가비지 μ»¬λ ‰μ…˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λ©΄ λ©”λͺ¨λ¦¬ 곡간이 μžλ™μœΌλ‘œ 동적 ν• λ‹Ή λœλ‹€. 그리고 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 객체의 λ©”λͺ¨λ¦¬ μ˜μ—­μ€ 가비지 컬렉터가 μžλ™μœΌλ‘œ ν•΄μ œν•œλ‹€.

var p = {x:1, y:2};
console.log(p);	// -> Object {x=1, y=2}
p = null;		// -> Object {x=1, y=2}λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œ

λ”°λΌμ„œ ν”„λ‘œκ·Έλž˜μ„œλŠ” ν•„μš”ν•œ 객체λ₯Ό μƒμ„±ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. κ·Έλ ‡λ‹€κ³  λ©”λͺ¨λ¦¬ 관리λ₯Ό λ¬΄μ‹œν•΄μ„œλŠ” μ•ˆλœλ‹€. ν•„μš”μ—†μ–΄μ§„ 객체가 계속 남아 μžˆμ–΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜λ©΄ μ„±λŠ₯이 크게 μ €ν•˜λ  수 μžˆλ‹€.


8.6 ν΄λ‘œμ €πŸ‘Š


8.6.1 ν΄λ‘œμ €

자기 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½μ—μ„œ ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” 자유 λ³€μˆ˜μ˜ μ‹λ³„μž 결정을 μ‹€ν–‰ν•œλ‹€.

var a = "A";
// λ‹«νžŒ ν•¨μˆ˜
function f() {
  var b = "B";
  // μ—΄λ¦° ν•¨μˆ˜
  function g() {
    var c = "C"; // 속박 λ³€μˆ˜
    console.log(a + b + c);
  }
  g();
}
f();

μœ„μ˜ μ½”λ“œλ₯Ό 보면 ν•¨μˆ˜ gκ°€ μ •μ˜λœ λ ‰μ‹œμ»¬ ν™˜κ²½μ€ λ³€μˆ˜ aκ°€ μ„ μ–Έλœ μ‹œμ λΆ€ν„° fν•¨μˆ˜κ°€ 호좜된 κ³³ κΉŒμ§€μ΄λ‹€. 그리고 이 λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ ν•¨μˆ˜ g의 자유 λ³€μˆ˜ a와 b의 μ‹λ³„μžλ₯Ό κ²°μ •ν•œλ‹€.
즉, ν•¨μˆ˜ g의 ν•¨μˆ˜ 객체와 객체가 μ°Έμ‘°ν•˜λŠ” λ ‰μ‹œμ»¬ ν™˜κ²½ μ»΄ν¬λ„ŒνŠΈκ°€ 자유 λ³€μˆ˜ a, b의 μ‹λ³„μž 결정을 μœ„ν•œ 자료 ꡬ쑰라고 ν•  수 μžˆλ‹€.

8.6.1 ν΄λ‘œμ €μ˜ 예제

자기 μžμ‹ μ΄ μ •μ˜λœ ν™˜κ²½μ—μ„œ ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” 자유 λ³€μˆ˜μ˜ μ‹λ³„μž 결정을 μ‹€ν–‰ν•œλ‹€.

function Person(name, age) {
  var _name = name;
  var _age = age;
  return {
    getName: function () {
      return _name;
    },
    getAge: function () {
      return _age;
    },
    setAge: function (x) {
      _age = x;
    },
  };
}
var person = Person("Tom", 20);
console.log(person.getName());	// Tom
console.log(person.getAge());	// 20
person.setAge(22);
console.log(person.getAge());	// 22

8.7 이름 κ³΅κ°„πŸ‘Š


8.7.1 μ „μ—­ 이름 κ³΅κ°„μ˜ μ˜€μ—Ό

μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜λ₯Ό μ „μ—­ 객체에 μ„ μ–Έν•˜λŠ” ν–‰μœ„λ₯Ό κ°€λ¦¬μΌœ μ „μ—­ 유효 λ²”μœ„λ₯Ό μ˜€μ—Όμ‹œν‚¨λ‹€λΌκ³  ν•œλ‹€. λ‹€μŒκ³Ό 같은 상황일 λ•Œ 이름이 κ²ΉμΉ  수 μžˆλ‹€.

  • 라이브러리 νŒŒμΌμ„ μ—¬λŸ¬ 개 읽어 λ“€μ—¬ μ‚¬μš©ν•  λ•Œ
  • 규λͺ¨κ°€ 큰 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ λ•Œ
  • μ—¬λŸ¬ μ‚¬λžŒμ΄ ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ λ•Œ

이름 κ³΅κ°„μ˜ μ˜€μ—Όμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ 두 가지 방법이 μžˆλ‹€.

객체λ₯Ό 이름 κ³΅κ°„μœΌλ‘œ ν™œμš©

var myApp = myApp || {}
myApp.name = "Tom";
myApp.showName = function() {...};

ν•¨μˆ˜λ₯Ό 이름 κ³΅κ°„μœΌλ‘œ ν™œμš©
ν•¨μˆ˜μ•ˆμ— μ„ μ–Έλœ λ³€μˆ˜λŠ” κ·Έ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 점을 ν™œμš©

var x = "global x";
(function () {
  var x = "local x";
  var y = "local y";
  console.log(x);	// local x
  console.log(y);	// local y
})();
console.log(x);		// global x
console.log(y);		// y is not defined
profile
FrontEnd Developer

0개의 λŒ“κΈ€