operate函数_跟着 redux 学 compose组合函数
把你的心 我的心串一串 串一株幸运草 串一个同心圆
文 / 景朝霞
来源公号 / 朝霞的光影笔记
ID / zhaoxiajingjing
目录0 / 热热身1 / redux 中的compose函数2 / 逐步分析(1)compose()函数调用① reduce第一轮遍历② reduce第一轮遍历③ reduce第三轮遍历(4)reduce遍历结束后,赋值③ 0xA003(0) 执行② 0xA002() 调用① 0xA001() 调用
0 / 热热身
function fun(n, o) { console.log(o); return { fun: function (m) { return fun(m, n); } }; } var c = fun(0).fun(1); c.fun(2); c.fun(3);
△ 答案是?
△ 图3.7_图解
1 / redux 中的compose函数
function compose(...funcs) { if (funcs.length === 0) { return arg => arg } if (funcs.length === 1) { return funcs[0] } return funcs.reduce((a, b) => (...args) => a(b(...args))) }
△ redux中的compose函数
我们普通写调用函数,但是可读性太差
const add1 = x => x + 1; const mul3 = x => x * 3; const div2 = x => x / 2; div2(mul3(add1(add1(0)))); //=>3
△ 普通调用函数
那么,需要写一个可读性较高的组合函数:
const operate = compose(div2, mul3, add1, add1); operate(0);
△ 调用compose函数
compose(div2, mul3, add1, add1)
传参的顺序与div2(mul3(add1(add1(0))))
调用函数的顺序关系
那么,我们上次写的reduceRight
从里面往外调用函数实现组合函数的调用
然而,redux使用的是reduce
按照输入参数的顺序调用的
2 / 逐步分析
咱们就根据:执行上下文、作用域、作用域链、VO、AO这些一步步分析即可
// funcs=[div2,mul3, add1, add1] 函数集合 // return funcs.reduce((a, b) => (...args) => a(b(...args))) return funcs.reduce((a, b) => { let fn = (x) => { return a(b(x)); }; return fn; });
△ 分析reduce的写法
发挥空间想象力的时候到了,跟上思路,别掉队~
(1)compose()函数调用
【0】EC(C001) 假设这是compse() 执行形成的执行上下文
operate 是一个函数
那么 ,compose return 出去的是一个函数
let result = funcs.reduce((a,b)=>{ return function anonymous(x){ return a(b(x)); }; });
△ result 得到的是一个函数
result 接收到的结果是一个函数
此时,需要通过reduce每次调用callback形成 函数私有上下文
在每次的函数的私有上下文中,都会创建一个匿名函数
每个匿名函数所处的作用域是不同的
代码执行到:funcs.reduce(callback)
① reduce第一轮遍历
【1】 第一轮遍历 EC(CB1)私有执行上下文
AO(CB1) 变量对象
a=div2
b=mul3
anonymous=0xA001
作用域链:
形参赋值:a=div2; b=mul3
变量提升:anonymous=0xA001
代码执行:
return function anonymous(x){ a(b(x)); }; //=====> 【return 0xA001】;
△ 第一轮循环返回的值
② reduce第一轮遍历
【2】第二轮遍历 EC(CB2) 私有执行上下文
AO(CB2) 变量对象
a=0xA001
b=add1
anonymous=0xA002
作用域链:
形参赋值:a=0xA001; b=add1
变量提升:anonymous=0xA002
代码执行:
return function anonymous(x){ a(b(x)); }; //=> 【return 0xA002】;
△ 第二轮循环返回的值
③ reduce第三轮遍历
【3】第三轮遍历 EC(CB3)私有执行上下文
AO(CB3) 变量对象
a=0xA002
b=add1
anonymous=0xA003
作用域链:
形参赋值:a=0xA003; b=add1
变量提升:anonymous=0xA003
代码执行:
return function anonymous(x){ a(b(x));}; //=> 【return 0xA003】;
△ 第三轮循环返回的值
(4)reduce遍历结束后,赋值
三轮遍历结束后,把0xA003
赋值给operate
operate(0)
执行
③ 0xA003(0) 执行
【3】EC(0xA003)
AO(0xA003)
x=0
作用域链:
形参赋值:x=0
代码执行:
a(b(x));
=> x 是自己的:x=0; a和b都是上级上下文的
=> a=0xA002
=> b=add1
==> 0xA002(add1(0))
=> add1(0) => x+1=1
=> add1(0) 就当它是最后结果了,为了最后看到的效果是一样的,就不写计算了
=> 0xA002() 调用
② 0xA002() 调用
【2】EC(0xA002)
AO(0xA002)
x = add1(0)
作用域链:
形参赋值:x=add1(0)
代码执行:
a(b(x));
=> x 是自己的:x=add1(0);a和b都是上级上下文的
=> a=0xA001
=> b=add1
==> 0xA001(add1(add1(0)))
=> add1(add1(0))就当是计算后的结果了
=> 0xA001() 调用
① 0xA001() 调用
【1】EC(0xA001)
AO(0xA001)
x = add1(add1(0))
作用域链:
形参赋值:x = add1(add1(0))
代码执行:
a(b(x));
=> x 是自己的:x=add1(add1(0)); a和b都是上级上下文的
=> a=div2
=> b=mul3
==> div2(mul3(add1(add1(0))))
即:div2(mul3(add1(add1(0))))
- end -
把你的心 我的心串一串
串一株幸运草 串一个同心圆
从"你"到"更好的你",有无限可能~
相关文章:

感恩有你,链客一周年!
感恩有你,链客一周年! 2018年6月16日,天气:晴,在这一天,诞生了一个崭新的技术社区:链客区块链技术问答社区(www.liankexing.com) 她的诞生让我们赋予了’利他‘的概念,…

【Python3_基础系列_006】Python3-set-集合
一、set集合的方法 set不是特别常用,但是set的一些特性可以方便处理一些特殊情况。 集合(set)是一个无序不重复元素的序列。 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { }…

springmvc xml 空模板
<?xml version"1.0" encoding"UTF-8"?><!-- Bean头部 --><beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:p"http://www.springframe…

mysql ltree_mysq基础知识总结l
一、Mysql架构二、Mysql查询过程例如执行select * from tablea where id4;三、Mysql中的事务及隔离级别事务:InnoDB存储引擎支持事务。事务是mysql的执行最小单元,也就是原子性。要么执行成功,要么执行失败。>start transaction>commit…

如何让自己时刻冷静的方法_4个方法,教你如何真正爱自己
很多人说,我想爱自己,看了很多文章,依然不知道如何爱自己。那你可以问一问自己,你对自己拥有的一切感到开心、快乐和满足吗?“爱自己”对你是知识还是习惯呢?实际上,当你的内在固有的思维模式转…

记录一个比较完整的python项目分析架构
世界杯:用Python分析热门夺冠球队 https://www.cnblogs.com/lemonbit/p/9174965.html 转载于:https://www.cnblogs.com/testerhome-yizhou2018/p/9287115.html

list,set,map,数组间的相互转换
1.list转set Java代码 Set set new HashSet( new ArrayList()); 2.set转list Java代码 List list new ArrayList( new HashSet()); 3.数组转为list Java代码 List stooges Arrays.asList( "Larry" , "Moe" , "Curly" ); 此时st…

void函数返回值_(*void(*)()0)() 是什么
(*void(*)()0)()代码分析这是啥这行代码,是我今天在看《C陷阱与缺陷》时看到的,一开始很不能理解。慢慢上网摸索一些后,大致理解了,现在来分享一下我所理解的这行代码。1.首先,得明白什么是函数指针。顾明思义…

老年手机英文改中文_这些手游大作你都玩了吗?手机游戏推荐
全 世 界 只 有 1 % 的 人 关 注 郭 叔 说你 真 是 个 特 别 的 人目前100000人 已关注 郭叔说郭叔说做一个有趣的人,从认识我开始。关注攻略交流群请添加微信:GLT962464 备注老规矩:游戏名(无备注不通过!!…
MySQL数据库(五)使用pymysql对数据库进行增删改查
折腾好半天的数据库连接,由于之前未安装 pip ,而且自己用的python 版本为3.6. 只能用 pymysql 来连接数据库,(如果有和我一样未安装 pip 的朋友请 点这里http://blog.csdn.net/qq_37176126/article/details/72824404 )…

vue调试工具如何使用_教你使用Vue.js的DevTools来调试vue项目
Vue DevTools项目的官方主页位于GitHub上:https://http://github.com/vuejs/vue-devtools。你可以找到安装说明,帮助解决一些问题等等。目前该扩展在Chrome和Firefox中得到支持,同样Safari也得到了支持。如果你想从安装扩展开始&a…

Python开发【第十篇】:CSS (二)
Python开发【前端】:CSS Kylin Zhang 发表于 2016-11-10 13:13:57css样式选择器 标签上设置style属性: <body><div style"height: 48px;">第一层</div><div style"height: 48px;">第二层</div><di…

java设计一个bank类实现银行_SAP银企直连之平安银行(ECC版)
关于讲解SAP中国本地化银企直连系统功能,它通过ECC和S4 HANA 1909两个不同版本的演示来讲解银企直连付款相关功能实施和应用,有兴趣的可以联系微信号:timijia进行付费获取。以下资料仅供大家参考:说明:因为平安银行较S…

spark ml中一个比较通用的transformer
spark ml中有许多好用的transformer,很方便用来做特征的处理,比如Tokenizer, StopWordsRemover等,具体可参看文档:http://spark.apache.org/docs/2.1.0/ml-features.html . 但是呢,这些都是一些特定的操作,组内的同事提了一个需求…

mysql 常用函数循环_近30个MySQL常用函数,看到就是学到,纯干货收藏!
概念:相当于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名隐藏了实现细节提高代码的可重用性使用:select 函数名(实参列表)【from 表】 【】中内容可省略正文:字符函数:length:…

连接Oracle错误:800a0e7a未找到提供程序的解决
一、现象: C#程序中需要以ProviderOraOLEDB.Oracle.1方式访问ORACLE数据库。但程序执行时报异常:未在本地计算机注册“OraOLEDB.Oracle.1”提供程序 二、解决方案: 1、在Oracle安装目录找到Oracle的主程序目录,点击鼠标右键->属…

定义一个属性_Python property属性
1. 什么是property属性一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法# ############### 定义 ###############class Foo: def func(self): pass # 定义property属性 property def prop(self): pass# ############### 调用 ###############foo_obj…

MySQL 字段类型知识
tinyint(m) 值的范围:-128 ~ 127;unsigned 时,0 ~ 255。存储占用1字节 m 默认为4,和存储空间、数字位数没有关系,表示左侧补空格(默认,声明 zerofill 则补0,如0001)到…

mysql 单实例部署_Mysql 数据库单机多实例部署手记
最近的研发机器需要部署多个环境,包括数据库。为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式。找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运行,再进行一系列的配置调…

用python做一个图片验证码
看一下做出来的验证码长啥样 验证码分析 1. 有很多点 2. 有很多线条 3. 有字母,有数字 需要用到的模块: 1. random 2. Pillow (python3中使用pillow) 安装pillow : pip install pillow pillow的用法: 创建一张图片: from PIL im…

地图测量面积工具app_全站仪的使用面积测量
测量与地图制作见习全站仪使用11 / 20#2020 #全站仪是全站型电子速测仪的简称,是电子经纬仪、光学测距仪及微处理器相结合的光电仪器。其可直接测量距离、角度、坐标,根据三角函数原理,已知两点坐标信息推算出无数个第三点的坐标信息。下面让…

Palette使用
1.定义: Palette:可以在一张图片里面分析出一些色彩特性:主色调、鲜艳的颜色、柔和颜色等等…… 2.使用: 1). 2).效果图 3.获取颜色样品: 1). 2).颜色组装算法: 3).效果图:转载于:https://www.cnblogs.com/jeffery336699/p/9294681.html

PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...
def a2(arg):if len(arg) > 2:del arg[2:]li [12,13,14,15] a2(li) print(li) 转载于:https://www.cnblogs.com/zgyc/p/6229722.html

文件流能转换格式吗_amr转换mp3格式文件
MP3是非常标准的音频数字编码格式。区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小。因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3。今天要给大家说的是如何把amr格式的音频文件转换成mp3格式…

1196: 数星星(二)(结构体专题)_福利:最新导数6大专题!高分段提分有困扰?听北大状元漫谈提分...
这是一篇适合数学120分以上的高中生深度研读的随感。文末有福利!振宇老师从教的十几年中,遇到高分段学生最大的困扰便是:130分以上每提一分便需要付出极大的努力。究其原因,便是思维不够严谨全面,无法拿全分࿰…

RTMP协议中的Chunk Stream ID (CID)的作用
一、协议分层 RTMP包是以Message的结构封装的,结构如下所示: 1)Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。 Message Type ID为8&#x…

fceux源码解析_fceux源码解析_从源代码制作deb包的两种方法以及修改已有deb包(转载)...
1. 原理1) deb包通常包含两部分:控制信息(DEBIAN目录)、安装内容(模拟"/"目录)2) 通过解开已有的deb包看其中内容i. 释放安装内容到dirname目录中$ dpkg-X xxx.deb dirnameii. 释放控制信息到当前目录下的DEBIAN子目录中$ dpkg-e xxx.deb2. 准备1) 安装相…

Centos 7 意外断电如何处理
拔U盘的时候,不小心碰到了主机上的开机键…… 还好默认的响应动作是睡眠…… 还不知道 CentOS 怎么样应对意外断电呢?! 转载于:https://www.cnblogs.com/liaozt/p/6232189.html

静茹docker容器的几种方法_Docker介绍及使用
什么是容器?容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等,kvm虚拟机,linux,系统文件程序:代码&#…

Elasticsearch 6.3.1、Head插件 安装及配置
安装Elasticsearch Elasticsearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch 也可以直接使用wget下载到某目录下, 本文所有下载的包都放在 /home/tools 中, 解压后移到 /home/apps目录下 wget https://artifacts.elastic.co/downloa…