일급 객체로서의 함수 [ Javascript ] [ JavaScript 문법 종합반 2주차 ]

2023. 6. 13. 18:00항해99/JavaScript 문법 종합반

// 일급 객체로서의 함수
// 일급객체(First-Class Object) 란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

// 함수가 일급 객체로 취급되는 5가지 경우

// 1 변수를 함수를 할당
// 함수가 마치 값으로 취급된다.
// 함수가 나중에 사용될 수 있도록 조치가 되었다.
const sayHello = function () {
  console.log("Hello");
};
sayHello(); // Hello

// 2 함수를 인자로 다른 함수에 전달할 수 있다.
// 콜백함수 : 매개변수로서 쓰이는 함수
// 고차함수 : 함수를 인자로 받거나 return 하는 함수
function callFunction(func) {
  // 매개변수로 받은 변수가 사실 함수다.
  func();
}

callFunction(sayHello);

// 3 함수를 반환할 수 있다.
function createAdder(num) {
  return function (x) {
    return x + num;
  };
}

const addFive = createAdder(5);
console.log(addFive(10)); // 15

// 일급 객체로서의 함수 ========================
const person = {
  name: "john",
  age: 31,
  isMarried: true,
  sayHello: function () {
    console.log(`Hello my name is ${this.name}`); // Hello my name is john
  },
  //   sayHello: () => { // 화살표함수는 this 를 바인딩 하지 않는다.
  //     console.log(`Hello my name is ${this.name}`); // Hello my name is undefined
  //   }
};

person.sayHello();

// 배열의 요소로 함수를 할당 ==========================
const myArr = [
  function (a, b) {
    return a + b;
  },
  function (a, b) {
    return a - b;
  },
];

console.log(myArr[0](1, 3)); // 4
console.log(myArr[1](10, 7)); // 3

function multiplyBy(num) {
  return function (x) {
    return x * num;
  };
}

function add(x, y) {
  return x + y;
}

const multiplyByTwo = multiplyBy(2);
const multiplyByThree = multiplyBy(3);
console.log(multiplyByTwo(10)); // 20
console.log(multiplyByThree(10)); // 30

const result = add(multiplyByTwo(5), multiplyByThree(10));
console.log(result); // 40