js 函数柯里化(Currying)
时间:2022-07-22
本文章向大家介绍js 函数柯里化(Currying),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原文链接:https://blog.spiritling.cn/posts/c0f17b1f/
在计算机科学中,柯里化(Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
从一道面试题谈谈函数柯里化从一道面试题谈谈函数柯里化
题目:使用 js 实现 add(1)(2)(3)(4) 返回 10
函数柯里化要求多个参数转为单一参数,所以相当于
function add() {
return Array.from(arguments);
}
// 调用:add(1, 2, 3, 4) => [1, 2, 3, 4]
// 转换为下面形式
function addCurrying() {
// do something
}
// 调用:addCurrying(1)(2)(3)(4) => [1, 2, 3, 4]
闭包拿参数
闭包:定义在一个函数内部的函数,静态保存所有了父级作用域的内部函数。所以每次的值可以保存住,到了最后可以全部访问到
所以,我们先来一个闭包来拿取到所有参数
var add = function (value) {
var result = [];
result.push(value);
// _add 函数就是一个闭包,拿取到父级作用域的值,因为_add函数已获取到父级数据,所以父级一直存在,没有释放
var _add = function (value2) {
result.push(value);
return _add;
};
// 此方法调用返回数组
_add.getResult = function () {
return result;
};
return _add;
};
这样通过上面函数就可以实现基本的柯里化要求
执行:
// addCurrying(1)(2)(3)(4).getResult => [1, 2, 3, 4]
// addCurrying(1)(2)(3)(4)
// =>
/*
ƒ (value2) {
result.push(value);
return _add;
}
*/
重写内置函数返回结果
上面的代码虽然已经获取到所有的参数,但是返回结果并没有自动返回,而是需要调用函数才返回。
并且由于不知道参数长度,也就无法通过参数数组长度来及时返回结果。
那么有什么方法可以解决呢??
当然有了,在 js 中函数是有原型链的,所以每个函数都继承了基本的一些方法。
当你定义一个函数后,你如果打印时只输入函数名,并不执行,则函数内部信息就被打印出来。
那么我们可以重写这个方法,来在结束后执行。
函数的 toString
方法可以打印函数体,所以我们改造下,让 toString
返回结果
//首先我们需要一个入口函数进行基本处理
var add = function (value) {
//定义一个保存所有传入的参数的数组
var result = [];
// 将第一个传入的参数放置进去
result.push(value);
// 定义函数 _add 引用result变量,使其保持不被销毁掉
var _add = function (subValue) {
// 将参数push进入result中去
result.push(subValue);
// 返回函数 _add 进行下次一调用
return _add;
};
// 将原生自带的toString 进行重写
_add.toString = function () {
return result;
};
// 返回 _add 函数进行下次调用
return _add;
};
执行结果
-
add(1)
=>[1]
-
add(1)(2)
=>[1,2]
-
add(1)(2)(3)
=>[1,2,3]
结束
通过上面的研究,解决一个函数柯里化问题。
- PySide——Python图形化界面入门教程(六)
- Python写的嗅探器——Pyside,Scapy
- 使用sklearn构建含有标量属性的决策树
- 利用Python sklearn的SVM对AT&T人脸数据进行人脸识别
- C/C++网络编程时注意的问题小结
- PHP防止SQL注入的方法
- HTML5离线缓存攻击测试
- IE的BHO通过IHTMLDocument2接口获得网页源代码
- 【C++】小心使用文件读写模式:回车('r') 换行('n')问题的一次纠结经历
- 【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题
- SEED缓冲区溢出实验笔记
- HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)
- Linux下ls命令显示符号链接权限为777的探索
- Django form表单
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 猿蜕变系列8——一文搞懂Interceptor操纵姿势
- 猿蜕变9——一文搞定SpringMVC的RESTFul套路
- 猿蜕变10——一文学会ORM的正确打开姿势
- 猿蜕变11——一文掌握mybatis全局玩儿法
- 猿蜕变12——一文搞定mybatis花式玩法
- 猿蜕变13——一文搞懂mybatis规范和标签
- 猿蜕变14——一文搞懂AOP的套路
- 猿蜕变15——一文搞懂Spring AOP的正确姿势
- 猿蜕变16——一文搞懂Spring事务花式玩法
- 猿蜕变17——一文掌握SSM框架搭建姿势
- 猿蜕变18——一文掌控SSM玩耍方式
- 猿蜕变19——一文掌握代码自动生成
- 基于Java的俄罗斯方块游戏的设计与实现
- Docker中部署RabbitMQ并使用Python3.x操作全书(Python操作RabbitMQ看这一篇就够了)
- 【CPP】模板类线性表