Javascript对象样式的模块进行功能编程

时间:2018-10-09 21:28:00

标签: javascript functional-programming

我正在开发一个简单的Javascript模块,我希望使其遵循功能性编程风格。

该模块基本上允许您测量事件开始和结束时经过了多少时间,并以2个测量结果的块的形式发送数据:

const register = {
  marks: {},
  marksCount: 0,

  restart: function () {
    this.marks = {}
    this.marksCount = 0
  },

  startMark: function (id) {
    performance.mark(`${id}/start`)
  },

  finishMark: function (id) {
    performance.mark(`${id}/end`)
    performance.measure(id, `${id}/start`, `${id}/end`)
    this.marksCount++
    this.marks[id] = performance.getEntriesByName(id, 'measure')[0]
    if (this.marksCount === 2) {
      console.log(this.marks)
      this.restart()
    }
  }
}


// then you can use it like this
register.startMark('event1')
register.startMark('event2')
register.finishMark('event1')
register.finishMark('event2')

我一直在阅读有关FP如何管理状态的文章,我真的很想看看如何使用纯FP原理来编写这个简单的模块,特别是我们如何防止对属性进行突变。

1 个答案:

答案 0 :(得分:2)

使对象不可写是非常简单的。例如。

const storage = v => () => v;
const test = storage(10); 
console.log(test()); // prints 10, but you have no way to change v

时间度量的功能版本可能如下所示:

const startMark = () => {
  const start = performance.now();
  return () => {
    const end = performance.now();
    return end - start;
  };
}

// How to use
const endMark1 = startMark();
const endMark2 = startMark();
const result1 = endMark1();
const result2 = endMark2();
console.log('time1', result1, 'time2', result2);

// do something else
const result11 = endMark1();
console.log('time1-2', result11);

由于其功能正常,您可以多次使用endTimer,它将返回从开始到现在的时间,即使是连续调用也是如此。