Functional JavaScript 笔记

Functional JavaScript

目录

Get Started with FP

  1. CSV parse:

    return _.reduce(str.split("\n"), function(table, row){

    table.push(_.map(row.split(","), function(cell){return cell.trim();})); return table;}, []); };

  2. 作者是ClojureScript的作者?

First-class Functions and Applicative Programming

  1. return _.reduceRight(arguments, function(truth,f){ return truth && f(); }, true);
  2. 传递null作为第一个参数给apply:意味着this引用全局对象...
  3. p44 传统的SQL Select实际上对应关系代数里的Project
  4. JS的lambda语法太麻烦,给写FP风格的代码带来了麻烦
    1. restrict( project( as(library, {ed: ‘edition‘}), [‘title‘,‘isbn‘,‘edition‘]),

      function(book){ return book.edition>1; } );

Variable Scope and Closures

High-order Functions

Function-Building Functions

  1. function partial(fun /*, pargs */){

    var pargs = _.rest(arguments);

    return function(/* arguments */){

    var args = cat(pargs, _.toArray(arguments));

    return fun.apply(fun, args);

    } }

Recursion

  1. trampoline(避免mutual-recursive溢出):

    1. function even(n){ if(n==0) return true; else return partial1(odd, n-1); }

      1. ==> odd(20000001)()()...();
    2. function trampoline(fun /*, args */){

      var result = fun.apply(fun, _.rest(arguments)); //又来了

      while(_.isFunction(result)) result = result();

      return result; }

  2. generator(惰性无限序列)
    1. head-tail()抽象,其中,tail封装了“剩余序列的计算”
    2. function genTake(n, gen){

      var doTake = function(x, g, ret){ if(x==0)return ret; else return partial(doTake, x-1, genTail(g), cat(ret, genHead(g)));}

      return trampoline(doTake, n, gen, []);

Purity, Immutability and Policies for Change

  1. Object#freeze => deepFreeze
  2. API:让对象修改方法返回新对象实例

Flow-based Programming

  1. _.chain
  2. LazyChain
    1. thunk:a function waiting to be called
    2. #force()
  3. jQuery $.Deferred()
  4. Pipelining
  5. Action(Monad):flowing in context?
    1. lift
    2. actions

Programming without Class

  1. Mixins

    1. var polyToString = dispatch( function(s){ return _.isString(s)? s : undefined; }, ...
  2. var MyMixin = {

    setValue: function(v){ ... this._value = v; this.notify(oldVal, v); }

  3. _.extend(MyClass.prototype, MyMixin);
  4. var CAS = function(val){ MyClass.call(this, val); }
    1. var CASMixin = ...

Appendix

  1. Underscore-contrib
  2. RxJS
  3. Bilby‘s multimethods
  4. allong.es:support for stateful iterators
  5. *Reducers:inspired by Clojure‘s reducer
  6. ClojureScript(作者就是写《The Joy of Clojure》的?)
  7. CoffeeScript
    1. Literate编程
    2. Varargs
    3. 列表理解
    4. 解构赋值
  8. Roy:inspired by ML
  9. Elm(+不用作字符串拼接,需要用++):FRP
时间: 2024-08-10 00:00:13

Functional JavaScript 笔记的相关文章

JavaScript笔记之Function

一.函数定义 (1)使用function declaration 格式:function functionName(parameters) { function body } 注:此种方式声明的函数作用域是全局的,即在声明之前可以调用 (2)使用function expression 格式:var name = function (parameters) { function body }; 注:与(1)不同,在声明之前不可以调用 (3)使用function constructor() 格式:v

javascript笔记(二)

concat() 连接多个字符串,返回合并后的字符串. 1 var s1="a"; 2 var s2="b"; 3 var s3="c"; 4 5 console.log(s1.concat(s2,s3));//abc concat() 方法的结果等同于:result = s1 + s2 + ... + sN.如果有不是字符串的参数,则它们在连接之前将首先被转换为字符串. 数组中的concat():将参数添加为数组的元素,返回新的数组. 1 va

[Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+1}" 反射获取函数源代码的功能很强大,使用函数对象的toString方法有严重的局限性.toString方法的局限性ECMAScript标准对函数对象的toString方法的返回结果(即该字符串)并没有任何要求.这意味着不同的js引擎将产生不同的字符串,甚至产生的字符串与该函数并不相关. 如果函数

[Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式传递给eval函数以达到同样的功能.程序员面临一个选择:应该将代码表示为函数还是字符串?毫无疑问,应该将代码表示为函数.字符串表示代码不够灵活的一个重要原因是:它们不是闭包. 闭包回顾 看下面这个图 js的函数值包含了比调用它们时执行所需要的代码还要多的信息.而且js函数值还在内部存储它们可能会引用

[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //"number" typeof "s";//"string" typeof null;//"object":ECMAScript把null描述为独特的类型,但返回值却是对象类型,有点困惑. 可以使用Object.prototype.t

"Becoming Functional" 阅读笔记+思维导图

<Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言,比如Java,Groovy,Scala.为了能够讲解所有的知识点,作者不得不在多个语言之间做切换,其实使用Erlang,Elixir甚至是C#做范例都不会这么累(因为C#有Linq,Lazy.....). 这本书侧重点是讲解基本概念,以及思维方式的转变.所以无论是搞哪一种函数式编程语言,都可以读一读,一开始接

JavaScript笔记杂谈篇(啥都有)

二维码缩放比例以43PX的倍数缩放最为标准. NuGet相关管理http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 学习笔记: http://kb.cnblogs.com/page/143190/ 动态创建标记,给标记添加样式,class,等等   vardtProductName=$("<dt></dt>",{style:"text-overflow: ellipsis;overflow

JavaScript笔记基础篇(二)

基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt报表时, 要显示一列百分比的数据,但因一些特别的原因,不能使用使用百分比样式,即如果数据是0.9538不能显示成“95.38%”的样式,必须显示成“95.38”. 开始时想使用javascript的内置函数Math.round(),可Math.round()只能显示为整数,而不能保留小数. 再网上搜

学习Javascript笔记1 Javascript对象1

以前学过一段时间Js,现在再看,感觉又像是新知识,说明自己对Js掌握的还不是很好(是很不好,从来就没好过,嘿嘿),在这里,在温习一下 如果各位大哥大姐不幸看到了,,额 额这只是自己的笔记. 在Js里面 面向对象的思想是绝对很重要的,大家如果看过大神的代码,就会知道在Js里面面向对象的思想有多么重要了 JavaScript 中的所有事物都是对象:字符串(String).数字(Number).数组(Array).日期(Date),等等. 在 JavaScript 中,对象是拥有属性和方法的数据. 属