js 函数式编程学习笔记


Posted in Javascript onMarch 25, 2017

(1)平常写的函数大多是接受值,合并值,返回值,比如经常写的for循环:

function printArray(array){
  for(var i=0;i<array.length;i++){
     print(array[i]); 
  }   
}

但是如果我们想做print之外的事情呢?怎么办?再写一个相似的,未免显得浪费,我们可以这样

function forEach(array,action){
  for(var i=0;i<array.length;i++){
    action(array[i]); 
  } 
}
forEach(["a","b","c"],print);

通过利用匿名函数,在编写for循环之类的可以省去很多无用的细节:

function sum(numbers){
  var total = 0;
  forEach(numbers,function(number){
     total+=number;
  })   
  return total;  
}

上面的例子中是“遍历数组”,并使其抽象化,函数作为函数参数传入....

(2)另一种是传入函数参数,返回函数,可以在“高阶函数”中传入arguments

function negate(func){
  return function(x){
    return !func(x); 
  }
}
var isNotNaN = negate(isNaN);
isNotNaN(NaN);

如果想要反转的函数接受参数大于1个,怎么办?? 很简单,借助apply方法,上下文传入NULL

传说中的组合模式:
function compose(f1,f2){
   return function(){
      return f1(f2.apply(null,arguments));
   };
}

var isNotNaN = compose(op["!"],isNaN);
isNotNaN(5); =>true

间接函数调用,如果运行次数较多还是不要用的好..

(3)sum函数实际上是算法的一个变体,该算法通常称为规约

function reduce(combine,base,array){
  forEach(array,function(element){
    base = combine(base,element);
  });
}

function add(a,b){
 return a+b;
}

reduce(add,0,array);

(4)另外一个与数组相关的有用的基本算法称为“映射”。它能够遍历数组

function map(func,array){
  var result = [];
  forEach(array,function(element){
    result.push(func(element));
  });
  return result;
}

map(Math.round,[0.01,2,9,Math.PI]);

(5)下面这段代码,可以研究下它的工作原理

function splitParagraph(text){
  function split(pos){
     if(pos == text.length) return [];
     else if(text.charAt(pos) == "*"){
         var end = findClosing(“*”,pos+1);
         frag = {type:“emphasized”,content:text.slice(pos+1,end)};
         return [frag].concat(split(end+1));  //回调
     } else if(text.charAt(pos) == "{"){
         var end = findClosing(“{”,pos+1);
         frag = {type:“emphasized”,content:text.slice(pos+1,end)};
         return [frag].concat(split(end+1));  //回调
     } else{
        var end = findOpeningOrEnd(pos),
           frag = {type:"normal",content:text.splice(pos+1,end)};
           return [frag].concat(split(end));

     }
  }
  function findClosing(character,from){
     var end = text.indexOf(character,from);
     if(end == -1) throw new Error("Missing closing ' "+character+"'");
     return end;
  }
  function findOpeningOrEnd(from){
     function indexOrEnd(character){
        var index = text.indexOf(character,from);
        return index = -1?text.length:index;
     }
     return Math.min(indexOrEnd("*"),indexOrEnd("{"));
  }
  
  return split(0);  
}

这种函数的编程风格很独特,使用递归而不是循环,其实递归效率是比较低的,改进如下:

function split(){
   var pos = 0,fragments = [];
   while(pop<text.lenght){
      if(text.charAt(pos) == "*"){
         var end = findClosing("*",pos+1);
         fragments.push({type:"emphasized",content:text.slice(pos+1,end)});
         pos = end+1;
      }else if(text.charAt(pos) == "{"){
         var end = findClosing("}",pos+1);
         fragments.push({type:"footnote",content:text.slice(pos+1,end)});
      }
      else{
         var end = findOpeningOrEnd(pos);
         fragments.push({type:“footnote”,content:text.slice(pos,end)});
         pos = end;
      }

   }
   return fragments;
}

(6)分布应用模式

function partial(func){
   var knownArgs = arguments;
   return function(){
      var realArgs = [];
      for(var i=1;i<knownArgs.length;i++){ //from 1
        realArgs.push(knowArgs[i]);
      }
      for(var i=0;i<arguments.length;i++){
        realArgs.push(arguments[i]); 
      }
      return func.apply(null,realArgs);
   }
}

map(partial(op["+"],1),[0,2,4,6,8,10]); // op["+"] swithcase 的一个function
Javascript 相关文章推荐
jQuery 操作下拉列表框实现代码
Feb 22 Javascript
Cookie 小记
Apr 01 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
微信小程序实现简单跑马灯效果
May 26 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 Javascript
Angular value与ngValue区别详解
Nov 27 Javascript
微信小程序登陆注册功能的实现代码
Dec 10 Javascript
微信小程序保持session会话的方法
Mar 20 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
Jul 28 Javascript
CodeMirror js代码加亮使用总结
Mar 25 #Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 #Javascript
在js中做数字字符串补0(js补零)
Mar 25 #Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 #Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 #Javascript
javascript作用域链与执行环境详解
Mar 25 #Javascript
vue中用动态组件实现选项卡切换效果
Mar 25 #Javascript
You might like
mysql 搜索之简单应用
2007/04/27 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python实现的文件同步服务器实例
2015/06/02 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python批量爬取下载抖音视频
2019/06/17 Python
区分python中的进程与线程
2020/08/13 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
20岁生日感言
2014/01/13 职场文书
生日寿宴答谢词
2014/01/19 职场文书
迟到早退检讨书
2014/02/10 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
《月迹》教学反思
2014/02/19 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
文案策划求职信
2014/03/18 职场文书
意向书范文
2014/03/31 职场文书
幼儿园教师求职信
2015/03/20 职场文书
个人承诺书格式范文
2015/04/29 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python