【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 5 函数式编程

来源:互联网 发布:bootstrap.js 编辑:程序博客网 时间:2024/05/18 03:15

在知乎上有人推荐的这本书,抱着试试看的态度在图书馆借了本,只有160+页,完全不像C++Primer Plus或其他编程书动辄800+pages。但是这本书主要是从编程思想上来由浅入深写一些作者的心得体会,好多地方自己之前都没有想过,也没有实践过,总之这书写的比较叼,应该多看几遍。


Chapter 5 函数式编程

本章主要讲了一些函数编程抽象思想及技巧,粗略的读了一遍,学到了些皮毛,有空回来再多看几遍,相信会有更多收获。

一、 throw+catch+try
程序处理用户错误输入常用!

二、 字符串链接问题
方案一、以空字符开始,接着使用“+=”操作符添加新内容;
方案二、使用数组保存字符串,然后调用join方法;
创建一个新字符串,尤其是大字符串,对于计算机来说是很大的工作量。方案一每一步都要创建一个新的字符串,并且只有在连接下一个字符时才会被丢弃。方案二将所有的小字符都保存在数组里,然后使用join连接,那么将只能创建一个大的新字符串。

三、 其他函数技巧
1. 操作符函数
由于JavaScript里的操作符都不是函数,每次需要时我们都不得不定义一个add函数。一个解决方案是自己创建一个对象

var op = {    "+": fucntion(a, b){return a + b;},    "==": fucntion(a, b){return a == b;},    "===": function(a, b){return a === b;},    "!": function(a){return !a;}    };

这样就可以编写

reduce(op["+"], 0 ,[1, 2, 3, 4, 5])

来统计数组的和。
2. 分布应用
如果我们需要一个函数,需要比较其参数是否为 0 或者将 1 添加到参数上,我们需要写一个新函数。针对这种情况,分布应用就派上用场了。接收一个函数 X 和一个或多个参数,然后创建一个新函数调用 X ,用到原来的参数和新传入的参数。(不得不说建议看英文版,中文版翻译的有点儿糟,有的地方想看懂翻译的意思比较困难。)
例如,partial(op[“*”], 5) 应该返回一个将参数进行5次相乘的新函数。可以使用函数的 apply 方法来定义这个分布:

function partial(func){    var knownArgs = arguments;//knownArgs变量是必须的,因为在内部函数里,arguments变量引用的是内部函数的参数而不是partial函数的参数。    return function(){        var realArgs = [];        for(var i = 1; i < knownArgs.length; i++)            realArge.push(knownArgs[i]);//arguments是伪数组,不能用concat方法复制。为解决该问题,手动复制他们。由于外部函数的第一个参数是要包装的函数,不是必须要复制的参数,所以第一个循环从 1 开始。        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]);

——》[1, 3, 5, 7, 9, 11]
3. 组合
遇到多种函数值时可采用的最后一个技巧是函数组合。核心思想:调用函数 A ,然后应用函数 B 得出结果。组合在数学里是个常见的概念,它可以表示为如下的高阶函数:

function compose(f1, f2){    return function(){        return f1(f2.apply(null, arguments));    }}

示例:

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

——》true
这里定义了一个新函数功能,没有使用 function 关键字。这样的定义通常都很短,当我们想创建一个简单函数的时候非常适用,例如,map函数或者 reduce 函数。
像这样定义函数运行速度会有点儿慢,因为它们要添加更多的简介函数调用。大多数时候没大问题,大部分代码的执行都将少于 1 次/秒,因而多出几微秒也不会很明显。但对于一秒钟要调用几千次的函数,应该考虑直接编写函数。

0 0
原创粉丝点击