Skip to content
Advertisement

how to concatenate function with javascript closure and object

i’m trying to find a solution to this exercise:

Implement the calculate function that adds an object that gives the ability to do the four mathematical operations (addition, subtraction, multiplication and division) on the same number and finally print out the result.

function calculate() {

}

const calculator = calculate();
calculator.add(2).add(4).multiply(3).sub(1).sub(3).divide(2).printResult(); // result will be: 7
console.log(calculator)

so, what is the right way to solve this (and if you can add comment will be appreciated

Advertisement

Answer

You can return the object itselft.

function calculate() {
  return {
    result: 0,
    add: function(num) {
      this.result += num;
      return this;
    },
    sub: function(num) {
      this.result -= num;
      return this;
    },
    multiply: function (num) {
      this.result *= num;
      return this;
    },
    divide: function (num) {
      this.result /= num;
      return this;
    },
    printResult: function () {
      return this.result;
    }
 }
};

const calculator = calculate();
const result = calculator.add(2).add(4).multiply(3).sub(1).sub(3).divide(2).printResult(); // result will be: 7
console.log(result);

Make sure to understand how this works in JavaScript. For instance, using functions is different than using arrow functions.

Reference: JavaScript this

Alternative solution using closure

function calculate() {
  let result = 0;
  return {
    add: function(num) {
      result += num;
      return this;
    },
    sub: function(num) {
      result -= num;
      return this;
    },
    multiply: function (num) {
      result *= num;
      return this;
    },
    divide: function (num) {
      result /= num;
      return this;
    },
    printResult: function () {
      return result;
    }
 }
};

const calculator = calculate();
const result = calculator.add(2).add(4).multiply(3).sub(1).sub(3).divide(2).printResult(); // result will be: 7
console.log(result);
Advertisement