闭包,函数式编程学习小记
对象是包含行为的数据,闭包是包含数据的行为。
闭包就是能够读取其他函数内部变量的函数,也可以让内部的局部变量通过闭包暴露给外部函数,所以本质上闭包就是将函数内部和函数外部连接起来的一座桥梁。
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
闭包,函数式编程学习小记相关推荐
- Java 8 函数式编程学习笔记
Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...
- 【Java】函数式编程学习笔记——Stream流
学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...
- JavaScript函数式编程学习
本文是我在函数式编程学习过程中,总结的笔记,也分享给想学函数式编程的同学. 函数式编程可能对于初学者来说,概念难以理解,入门比较难.所以本文从两部分去学习. 在你身边你左右 --函数式编程别烦恼 第一 ...
- 函数式编程学习之路(三)
入门: 函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打 ...
- JavaScript函数式编程学习 1
本文是我在函数式编程学习过程中,总结的笔记,也分享给想学函数式编程的同学. 函数式编程可能对于初学者来说,概念难以理解,入门比较难.所以本文从两部分去学习. 在你身边你左右 --函数式编程别烦恼 第一 ...
- Java8-----系统复习及扫盲(3)--函数式编程学习
原文出处: 琴水玉 引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下 ...
- Java函数式编程学习——Stream流
目录 概述 案例数据准备 1. 常用操作 2. 中间操作 filter map distinct sorted limit skip flatMap 3. 终结操作 foreach count max ...
- 函数式编程学习之路(一)
起点: 作为一个比较资深的码农,写程序是有些年头了.最早用过C,VB,Delphi等写过不少过程式代码. 后来,04,05年左右吧,为了提升技术,仔细思考学习了面向对象,终于有一天开悟,基本上算是进入 ...
- Haskell函数式编程学习笔记
文章目录 Function Pattern Matching Guards Where Let it be Case Recursion Types Int Integer Float Double ...
最新文章
- 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!
- 教育部:建设100+AI特色专业, 500万AI人才缺口要补上!
- pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降
- 题目1090:路径打印
- CentOS7.0安装Nginx 1.7.4
- 移动云2020 H1营收44.57亿元,同比增长556.4%
- ObjectMapper忽略未知字段
- 在线CSV转Excel工具
- visio常用快捷键_visio2003常用快捷键有哪些
- uniapp开发原生android插件,获取浏览器cookie
- 如何判断自己的手机是山寨机?如何判断山寨机的芯片型号和平台?
- Excel ----- 身份证自动判断男女 公式
- Yingye Zhu‘s Luogu Background
- JavaAwt子部件定位设置大小,setBounds(x, y, w, h);setLocation(x, y); setSize(w, h); 一开始不起作用,加个延时起作用了
- android pc模拟器哪个好用,电脑手游安卓模拟器哪个好用流畅 好用的安卓模拟器...
- MySQL 最新版行政区划
- 常用国外会议出版社及出版社地址
- html js中间显示悬浮窗,Js 悬浮窗口(可固定位置)代码
- 【示波器的基本使用】以及【示波器按键面板上各个按键含义的介绍】
- 沐神d2l视频环境安装
热门文章
- 中医点滴 2 --- 保和丸 + 口气重
- 人脸检测对齐--Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
- Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用
- 报错解决:fatal error: json/json.h: No such file or directory
- spring依赖注入底层原理与源码分析
- html 颜色叠加图片,如何在背景图片上添加颜色叠加?
- java随机产生100个大小写字母_Java生成固定长度的随机字符串(以大小写字母和数字)...
- 华为鸿蒙概念机990,华为5G概念新机:鸿蒙OS系统+麒麟990+石墨烯 安卓机皇来势汹汹...
- 二自由度云台扫描算法_二自由度云台的机器视觉控制
- ReentrantLock中的Condition(等待和唤醒)