Scope

hoisting

let funcExpressed = "to be a function";

console.log(typeof funcDeclared); // 'function' // 함수선언문은 hoisting이 일어나기 때문에
console.log(typeof funcExpressed); // 'string' 위에 있는 'to be a function' 때문에..
console.log(funcTest); // ReferenceError: funcTest is not defined

function funcDeclared() {
  return "this is a function declaration";
}

funcExpressed = function () {
  return "this is a function expression";
};

funcTest = function () {
  return "this is a test";
};

default parameter

function defaultParameter(num = 5) {
    return num;
}

console.log(defaultParameter()) // 5
console.log(defaultParameter(10) // 10

closure

function increaseBy(increaseByAmount) {
  return function (numberToIncrease) {
    return numberToIncrease + increaseByAmount;
  };
}

const increaseBy3 = increaseBy(3);
const increaseBy5 = increaseBy(5);

console.log(increaseBy3(10)); // 13;
console.log(increaseBy5(10)); // 15;
console.log(increaseBy(8)(6) + increaseBy(5)(9)); // 28;
let age = 27;
let name = "DK";
let height = 179;

function outerFn() {
  let age = 24;
  name = "RM";
  let height = 178;

  function innerFn() {
    age = 26;
    let name = "SG";
    return height;
  }
  innerFn();

  console.log(age); // 26
  console.log(name); // 'RM'

  return innerFn;
}

const innerFn = outerFn(); // innerFn에 outerFn()을 할당함으로 innerFn()을 outerFn함수 밖에서도 사용할 수 있게 되었다.

console.log(age); // 27
console.log(name); // 'RM'
console.log(innerFn()); // 178 // innerFn() === outerFn()()

함수 호출이 어디서 이뤄지는지 파악하는 것 중요


closure가 아닌경우

const increase = function () {
  let num = 0;
  return ++num;
};
console.log(increase1()); // 1
console.log(increase1()); // 1
console.log(increase1()); // 1

closure인 경우

const increase = function () {
  let num = 0;
  return function () {
    return ++num;
  };
};
const increase1 = increase();
console.log(increase1()); // 1
console.log(increase1()); // 2
console.log(increase1()); // 3

카테고리:

태그:

업데이트:

댓글남기기