JavaScript函数柯里化
JavaScript 函数 柯里化
2023-09-14 09:00:58 时间
JavaScript是以函数为一等公民的函数式语言。函数在JavaScript中也是一个对象(继承制Function),函数也可以作为参数传递成函数变量。最近几年函数式也因为其无副作用的特性、透明性、惰性计算等在高并发,大数据领域火起来了。
JavaScript中也有如Underscore、lodash之类的函数式库,如lodash的使用方式:
var names = _.chain(users) .map(function(user){ return user.user; .join(" , ") .value(); console.log(names);
关于lodash更多内容请参考JavaScript工具库之Lodash.
今天文章将以高阶函数中的柯里化方式来,看看JavaScript的函数式能力。
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
在理论计算机科学中,柯里化提供了在简单的理论模型中比如只接受一个单一参数的lambda 演算中研究带有多个参数的函数的方式。
JavaScript的柯里化实现下边的例子,我们将把柯里化方式泛化为接受任意个参数,直到声明的方法参数个数饱和才执行,所以根据参数个数可以有多种柯里化函数产生。
代码如下:
(function(global) { var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m, FN_ARG_SPLIT = /,/, FN_ARG = /^\s*(_?)(\S+?)\1\s*$/, STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; var getArgLength = function(func) { var fnText = func.toString().replace(STRIP_COMMENTS, ); var argDecl = fnText.match(FN_ARGS); var params = []; argDecl[1].split(FN_ARG_SPLIT).forEach(function(arg) { arg.replace(FN_ARG, function(all, underscore, name) { params.push(name); return params.length; var curryFunc = function(func, len) { len = len || getArgLength(func); var args = []; if (len === 0) { return func.apply(null); return function() { [].push.apply(args, [].slice.apply(arguments)); if (args.length = len) { return func.apply(null, args); return arguments.callee; global.curryFunc = curryFunc; })(this); function add(x, y, z) { return x + y + z; console.log("result 1:", curryFunc(add)(1, 2)(3)); console.log("result 2:", curryFunc(add)(1)(2, 3)); console.log("result 3:", curryFunc(add)(1)(3)(2)); function add(x, y, z) { return x * y * z; console.log("result 1:", curryFunc(add)(2, 4)(6)); console.log("result 2:", curryFunc(add)(2)(4, 6)); console.log("result 3:", curryFunc(add)(2)(6)(4)); function sayHello() { return "hello"; console.log(curryFunc(sayHello));
首先上面会利用正则来获取传入函数的参数个数。再返回一个函数的代理,每次的调用都会将传入参数缓存在args临时变量中,直到参数个数饱和才会立即执行。代码比较冗长,慢慢品味,当然有不足之处,也希望大家指出来。
JavaScript函数的基本使用 术语foobar, foo, bar, baz 和qux经常在计算机编程或计算机相关的文档中被用作占位符的名字。当变量,函数,或命令本身不太重要的时候,foobar, foo, bar, baz 和qux就被用来充当这些实体的名字,这样做的目的仅仅是阐述一个概念,说明一个想法。这些术语本身相对于使用的场景来说没有任何意义。
相关文章
- javascript类和原型学习笔记
- JavaScript中给onclick绑定事件后return false遇到的问题
- JavaScript Function.apply() 函数详解
- JavaScript中的Function(函数)对象详解
- JavaScript核心功能之模块的导入导出
- 第一百一十五节,JavaScript,DOM操作表格
- 【JavaScript】函数
- 从javascript的两个例子谈开
- 模块化的JavaScript
- JavaScript获取图片的原始尺寸
- [Javascript] Broadcaster, operator, listener pattern: Write a debounce operator -- 1
- TypeScript里的高阶函数-返回函数的函数,以及对应的JavaScript代码
- js(JavaScript)判断两个数组是否相等
- 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)
- javascript---对象和函数的引用、浅拷贝、深拷贝、递归
- JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
- Javascript函数的简单学习
- Javascript 全局函数是 window 的函数
- python web py入门(40)- javascript的函数
- 详解javaScript的事件中,复杂数据类型的传参(数组,对象,函数)