React-高阶函数_函数柯里化
高阶函数_函数柯里化
高阶函数(定义)
如果一个函数符合下面两个规范,就是高阶函数:
如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item的函数了)
如果A函数,调用的返回值依然是一个函数,那么A也称为是高阶函数(常见的高阶函数:Promise、setTimeout、arr.map()等等数组内置的方法)
函数柯里化(定义)
通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
(有点像回调地狱的感觉,就是一直then)
一个柯里化的例子:
class Login extends React.Component {
state = {
username: '',
password: ''
}
saveFormData = (dataType) => {
console.log(dataType);
return event => {
this.setState({[dataType] : event.target.value})
}
}
render() {
return (
<form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
用户名:<input onChange={this.saveFormData('username')} type="text" name="username"/>
密码:<input onChange={this.saveFormData('password')} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}
例子疑问一:
为什么通过 this.saveFormData('username') 这样不是会把返回值给onChange函数吗?
回答:如果saveFormData()函数返回的是一个函数的话就可以
解释:
因为this.saveFormData('username'),把‘username’传递作为saveFormData的形参dataType
返回给onChange的函数相当于
onChange={ event => { this.setState({[username] : event.target.value}) } }
所以这个event其实就是这个input的元素对象了
例子疑问二:
为什么用{[dataType] : event.target.value}
解释:
假如我们写的是dataType : event.target.value,其实就相当于是给this.state.dataType赋值了,但是dataType它要表示的是username或者是password,而不是dataType这个变量
比如说 obj = { a: 2} ,可以通过obj.a获取,也可以通过obj[a]获取
而下面其实省略了一点东西,完整的是 this[dataType],因为我们把dataType通过参数传递进来了
它是this的一个属性了,我们访问dataType的时候,其实默认的是通过this.dataType也就是通过
this当前作用域来找到对应的变量的
因为dataType是我们传递过来的形式参数,所以通过this.dataType可以获取到我们的形式参数了
没有柯里化的例子
class Login extends React.Component {
state = {
username: '',
password: ''
}
saveFormData = (dataType, event) => {
this.setState({[dataType] : event.target.value})
}
handleSubmit = (event) => {
event.preventDefault() // 阻止表单提交默认事件
const {username, password} = this.state
alert(`你输入的用户名是:${username}, 你输入的密码是:${password}`)
}
render() {
return (
<form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
用户名:<input onChange={event => this.saveFormData('username', event) } type="text" name="username"/>
密码:<input onChange={event => this.saveFormData('password', event) } type="password" name="password"/>
<button>登录</button>
</form>
)
}
}
React-高阶函数_函数柯里化的更多相关文章
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
承接上文:Java函数式编程:一.函数式接口,lambda表达式和方法引用 这次来聊聊函数式编程中其他的几个比较重要的概念和技术,从而使得我们能更深刻的掌握Java中的函数式编程. 本篇博客主要聊聊以 ...
- 浅析 JavaScript 中的 函数 uncurrying 反柯里化
柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...
- 从 ES6 高阶箭头函数理解函数柯里化
前言:第一次看到多个连续箭头函数是在一个 react 项目中,然鹅确认了下眼神,并不是对的人,因为看得一脸懵逼.em......于是开始各种搜索,先是知道了多个连续箭头函数就是 es6 的多次柯里化的 ...
- JS的闭包、高阶函数、柯里化
本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
- JavaScript函数柯里化
函数式 JavaScript是以函数为一等公民的函数式语言.函数在JavaScript中也是一个对象(继承制Function),函数也可以作为参数传递成函数变量.最近几年函数式也因为其无副作用的特性. ...
- swift 学习(二)基础知识 (函数,闭包,ARC,柯里化,反射)
函数 func x(a:Int, b:Int) {} func x(a:Int, b:Int) -> Void {} func x(a:Int, b:Int) ->(Int,Int ...
- 浅析 JavaScript 中的 函数 currying 柯里化
原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
随机推荐
- WPF日积月累之TreeView动态绑定
一.概述 本文演示了如何递归生成数据,用于绑定TreeView以及TreeItem的双击事件. 二.参考代码 1 using System; 2 using System.Collections.Ge ...
- IO异常--缓冲流--转换流--序列化流( IO流2 )
1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw ...
- [转载]getContentPane()
关于setContentPane()和getContentPane()的应用 我们可以在 JFrame 对象中添加 AWT 或者 Swing 组件.但是,虽然它有 add 方法,却不能直接 ...
- Lyndon 相关的炫酷字符串科技
浅谈从 Lyndon Words 到 Three Squares Lemma By zghtyarecrenj 本文包括:Lyndon Words & Significant Suffixes ...
- 使用Operator State方式
使用 operator state的方式有以下几种: 方式一: stateful function(RichFunction) 实现 CheckpointFunction 接口 必须实现两个方法:Vo ...
- 分数化循环小数C++实现
引言 前一阵做了一个有理数四则混合运算的程序(详见:用C++实现的有理数(分数)四则混合运算计算器),以分数形式呈现运算结果.这次添加以循环小数形式呈现运算结果的功能.例如: Please input ...
- 浅谈Java和Go的程序退出
前言 今天在开发中对Java程序的退出产生了困惑,因为题主之前写过一段时间Go,这两者的程序退出逻辑是不同的,下面首先给出结论,再通过简单的例子来介绍. 对于Java程序,Main线程退出,如果当前存 ...
- CentOS 7.3安装Zabbix3.2
一.ZABBIX概述 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. Zabbix的功能和特性: 1.安装与配置简单: ...
- Qt中QOpengl的QMatrix4x4矩阵作用原理以及使用方法
1.矩阵具有坐标变换的作用,例如:左乘一个旋转矩阵,实现点的坐标旋转,左乘一个平移矩阵实现,点的平移 2.一个点可以同时串联相乘几个变换矩阵,实现坐标连续变换,根据左乘规则,右边矩阵先作用于点,作用顺 ...
- 解决win10 cmd运行python弹出windows应用商店下python应用程序
方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...