[Javascript] Intro to Recursion - Refactoring to a Pure Function

Previous post: http://www.cnblogs.com/Answer1215/p/4990418.html

let input, config, tasks;

input = [‘dist‘];

config = {
  "dist": ["build", "deploy"],
  "build": [‘js‘, ‘css‘, ‘vender‘],
  "js": [‘babel‘, ‘ng-Annotate‘, "uglify"],
  "css": ["sass", "css-min"]
};

tasks = [];

getTasks(input);

function getTasks(input){

  input.forEach((task)=>{
    if(config[task]){
      getTasks(config[task]);
    }else{
      tasks.push(task);
    }
  })
};

console.log(tasks);

The getTasks works but has some problem:

  • we depend on the outside variable ‘tasks‘ and ‘config‘, so there are side effect
  • there is no return value, hard to test
let input, config, tasks;

input = [‘dist‘];

config = {
  "dist": ["build", "deploy"],
  "build": [‘js‘, ‘css‘, ‘vender‘],
  "js": [‘babel‘, ‘ng-Annotate‘, "uglify"],
  "css": ["sass", "css-min"]
};

tasks = [];

var res = getTasks(input, []);

function getTasks(input, initial){

  return input.reduce((prev, next)=>{
    if(config[next]){
      return getTasks(config[next], prev);
    }else{
      return prev.concat(next);
    }
  }, initial);
};

console.log(res);

The code has been improved, we return the value from the getTasks() function and we don‘t modify the tasks array anymore.

Just one thing we still need to do is we still depend on ‘config‘:

let input, config;

input = [‘dist‘];

config = {
  "dist": ["build", "deploy"],
  "build": [‘js‘, ‘css‘, ‘vender‘],
  "js": [‘babel‘, ‘ng-Annotate‘, "uglify"],
  "css": ["sass", "css-min"]
};

var res = getTasks(config, input, []);

function getTasks(config, input, initial){

  return input.reduce((prev, next)=>{
    if(config[next]){
      return getTasks(config ,config[next], prev);
    }else{
      return prev.concat(next);
    }
  }, initial);
};

console.log(res);
时间: 2024-11-07 13:37:07

[Javascript] Intro to Recursion - Refactoring to a Pure Function的相关文章

Function Programming - 纯函数(Pure Function)

纯函数的定义,非常重要!! Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用. 老样子,我们还是从最简单的栗子开始: var minimum = 21; var OutercompareNumber = function(number) { return number > minimum; } 以及 var InnercompareNumber = function(number) { var minimum = 21; return number >

关于Javascript中通过var关键字声明变量和function关键字声明函数的笔记

一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1,b,c; //关键字显式声明变量a,b,c,并给a赋值console.log(a); //1 //由于b,c未定义变量类型,因此输出"undefined"console.log(b); //undefinedconsole.log(c); //undefined //如果变量未声明,则输出

什么叫pure function(纯函数)

在Knockout中,用到了pureComputer(),其原理来自于纯函数(pure function).那么,什么叫纯函数呢? 纯函数 (来自:http://en.wikipedia.org/wiki/Pure_function) 在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数: 给出同样的参数值,该函数总是求出同样的结果.该函数结果值不依赖任何隐藏信息或程序执行处理可能改变的状态或在程序的两个不同的执行,也不能依赖来自I/O装置的任何外部的输入(通常是这样的-

react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路

在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes 或者纯 函数时,这种自动绑定就不复存在了,我们需要手动实现 this 的绑定. 1.bind方法进行绑定,这个方法可以帮助我们绑定事件处理器内的 this ,并可以向事件处理器中传 递参数,如下图清晰明了: bind方法绑定 2.箭头函数进行绑定,箭头函数不仅是函数的“语法糖”,它还自动绑定了定义

[Javascript] Intro to the Web Audio API

An introduction to the Web Audio API. In this lesson, we cover creating an audio context and an oscillator node that actually plays a sound in the browser, and different ways to alter that sound. var context = new window.AudioContext() || new window.

理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承

本文参考了http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html这篇文章,对其内容作了个简单总结,形成了几条简单的结论,让读者更容易记住prototype.__proto__.Object.Function之间的关系. 结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端. (typeof Object.prototype) === object;//true Object.prototype.

JavaScript——关于字符串的replace函数中的function函数的参数

1 <!DOCTYPE> 2 <html> 3 <head> 4 </head> 5 <body> 6 <script type="text/javascript"> 7 function test(s){ 8 var pattern=/&([^&;]+);/g; 9 s.replace(pattern,function(a,b,c,d,e){ 10 alert(a); 11 alert(b); 1

Effective JavaScript Item 19 使用高阶函数 (High-Order Function)

本系列作为Effective JavaScript的读书笔记. 不要被高阶函数这个名字给唬住了.实际上,高阶函数只是代表了两类函数: 接受其他函数作为参数的函数 返回值为函数的函数 有了这个定义,你也许就发现你已经使用过它们了,典型的就是对于一些事件的处理时传入的回调函数. 另外的一个典型使用场景就是Array类型的sort函数,它可以接受一个function作为排序时比较的判断依据: [3, 1, 4, 1, 5, 9].sort(function(x, y) { if (x < y) { r

javascript中的call.apply方法是针对function本身定义的内容,并不能将

最近研究了js的继承,看了幻天芒的文章http://www.cnblogs.com/humin/p/4556820.html#3947420,明白了最好是使用apply或call方法来实现继承. 但是对于call能不能将funciton的prototype内容一同复制,有疑惑,实验之后发现是不行的.看下面的代码,c.g()系统是报错不识别,不认为其是一个函数. function f(){ this.a ="a"; this.b = function(){ console.log(&qu