对象是包含行为的数据,闭包是包含数据的行为。

闭包就是能够读取其他函数内部变量的函数,也可以让内部的局部变量通过闭包暴露给外部函数,所以本质上闭包就是将函数内部和函数外部连接起来的一座桥梁。

function f1(){var n=999;nAdd=function(){n+=1}function f2(){alert(n);}return f2;
}var result=f1();
result(); // 999
nAdd();
result(); // 1000

//f2中用了f1中的局部变量,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。这样就可以达到局部变量在多次调用闭包时候共享的目的。

//这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

//如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。//代码片段一
var name = "The Window";var object = {name : "My Object",getNameFunc : function(){return function(){return this.name;};}
};
alert(object.getNameFunc()());//代码片段二
var name = "The Window";var object = {name : "My Object",getNameFunc : function(){var that = this;return function(){return that.name;};}
};
alert(object.getNameFunc()());

一个介绍js函数式编程的gitbook https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/

// 把整个应用里的所有 httpGet 调用都改成这样,可以传递 err 参数。
httpGet('/post/2', function(json, err){return renderPost(json, err);
});
// 写成一等公民函数的形式,要做的改动将会少得多:
httpGet('/post/2', renderPost);  // renderPost 将会在 httpGet 中调用,想要多少参数都行

// 纯的
var checkAge = function(age) {var minimum = 21;return age >= minimum;
};//我们也可以让 minimum 成为一个不可变(immutable)对象,这样就能保留纯粹性,因为状态不会有变化。要实现这个效果,必须得创建一个对象,然后调用 Object.freeze 方法:
var immutableState = Object.freeze({minimum: 21
});

// 柯里化 curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
var add = function(x) {return function(y) {return x + y;};
};var increment = add(1);
var addTen = add(10);increment(2);
// 3

addTen(2);
// 12

// 我们来创建一些 curry 函数享受下(译者注:此处原文是“for our enjoyment”,语出自圣经)var curry = require('lodash').curry;var match = curry(function(what, str) {return str.match(what);
});var filter = curry(function(f, ary) {return ary.filter(f);
});match(/\s+/g, "hello world");
// [ ' ' ]

match(/\s+/g)("hello world");
// [ ' ' ]var hasSpaces = match(/\s+/g);
// function(x) { return x.match(/\s+/g) }

filter(hasSpaces, ["tori_spelling", "tori amos"]);
// ["tori amos"]var findSpaces = filter(hasSpaces);
// function(xs) { return xs.filter(function(x) { return x.match(/\s+/g) }) }

findSpaces(["tori_spelling", "tori amos"]);
// ["tori amos"]

//代码组合(compose,以下将称之为组合):
var compose = function(f,g) {return function(x) {return f(g(x));};
};//让代码从右向左运行,而不是由内而外运行,我觉得可以称之为“左倾”(吁——)。我们来看一个顺序很重要的例子:
var head = function(x) { return x[0]; };
var reverse = reduce(function(acc, x){ return [x].concat(acc); }, []);
var last = compose(head, reverse);last(['jumpkick', 'roundhouse', 'uppercut']);
//=> 'uppercut'// 结合律(associativity)
var associative = compose(f, compose(g, h)) == compose(compose(f, g), h);
// true

//pointfree 模式指的是,永远不必说出你的数据。咳咳对不起(译者注:此处原文是“Pointfree style means never having to say your data”,源自 1970 年的电影 Love Story 里的一句著名台词“Love means never having to say you're sorry”。)// 非 pointfree,因为提到了数据:word
var snakeCase = function (word) {return word.toLowerCase().replace(/\s+/ig, '_');
};// pointfree
var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase);

TODO 未完待续 https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch6.html

闭包,函数式编程学习小记相关推荐

  1. Java 8 函数式编程学习笔记

    Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...

  2. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  3. JavaScript函数式编程学习

    本文是我在函数式编程学习过程中,总结的笔记,也分享给想学函数式编程的同学. 函数式编程可能对于初学者来说,概念难以理解,入门比较难.所以本文从两部分去学习. 在你身边你左右 --函数式编程别烦恼 第一 ...

  4. 函数式编程学习之路(三)

    入门: 函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打 ...

  5. JavaScript函数式编程学习 1

    本文是我在函数式编程学习过程中,总结的笔记,也分享给想学函数式编程的同学. 函数式编程可能对于初学者来说,概念难以理解,入门比较难.所以本文从两部分去学习. 在你身边你左右 --函数式编程别烦恼 第一 ...

  6. Java8-----系统复习及扫盲(3)--函数式编程学习

    原文出处: 琴水玉 引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下 ...

  7. Java函数式编程学习——Stream流

    目录 概述 案例数据准备 1. 常用操作 2. 中间操作 filter map distinct sorted limit skip flatMap 3. 终结操作 foreach count max ...

  8. 函数式编程学习之路(一)

    起点: 作为一个比较资深的码农,写程序是有些年头了.最早用过C,VB,Delphi等写过不少过程式代码. 后来,04,05年左右吧,为了提升技术,仔细思考学习了面向对象,终于有一天开悟,基本上算是进入 ...

  9. Haskell函数式编程学习笔记

    文章目录 Function Pattern Matching Guards Where Let it be Case Recursion Types Int Integer Float Double ...

最新文章

  1. 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!
  2. 教育部:建设100+AI特色专业, 500万AI人才缺口要补上!
  3. pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降
  4. 题目1090:路径打印
  5. CentOS7.0安装Nginx 1.7.4
  6. 移动云2020 H1营收44.57亿元,同比增长556.4%
  7. ObjectMapper忽略未知字段
  8. 在线CSV转Excel工具
  9. visio常用快捷键_visio2003常用快捷键有哪些
  10. uniapp开发原生android插件,获取浏览器cookie
  11. 如何判断自己的手机是山寨机?如何判断山寨机的芯片型号和平台?
  12. Excel ----- 身份证自动判断男女 公式
  13. Yingye Zhu‘s Luogu Background
  14. JavaAwt子部件定位设置大小,setBounds(x, y, w, h);setLocation(x, y); setSize(w, h); 一开始不起作用,加个延时起作用了
  15. android pc模拟器哪个好用,电脑手游安卓模拟器哪个好用流畅 好用的安卓模拟器...
  16. MySQL 最新版行政区划
  17. 常用国外会议出版社及出版社地址
  18. html js中间显示悬浮窗,Js 悬浮窗口(可固定位置)代码
  19. 【示波器的基本使用】以及【示波器按键面板上各个按键含义的介绍】
  20. 沐神d2l视频环境安装

热门文章

  1. 中医点滴 2 --- 保和丸 + 口气重
  2. 人脸检测对齐--Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
  3. Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用
  4. 报错解决:fatal error: json/json.h: No such file or directory
  5. spring依赖注入底层原理与源码分析
  6. html 颜色叠加图片,如何在背景图片上添加颜色叠加?
  7. java随机产生100个大小写字母_Java生成固定长度的随机字符串(以大小写字母和数字)...
  8. 华为鸿蒙概念机990,华为5G概念新机:鸿蒙OS系统+麒麟990+石墨烯 安卓机皇来势汹汹...
  9. 二自由度云台扫描算法_二自由度云台的机器视觉控制
  10. ReentrantLock中的Condition(等待和唤醒)