JS编程建议——75:函数柯里化

简介: 75:函数柯里化

建议75:函数柯里化
柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数。下面可以通过例子来帮助理解。
function adder(num) {

return function(x) {
    return num + x;
}

}
var add5 = adder(5);
var add6 = adder(6);
print(add5(1)); // 6
print(add6(1)); //7
函数adder接受一个参数,并返回一个函数,这个返回的函数可以像预期那样被调用。变量add5保存着adder(5)返回的函数,这个函数可以接受一个参数,并返回参数与5的和。柯里化在 DOM 的回调中非常有用。
函数柯里化的主要功能是提供了强大的动态函数创建方法,通过调用另一个函数并为它传入要柯里化(currying)的函数和必要的参数而得到。通俗点说就是利用已有的函数,再创建一个动态的函数,该动态函数内部还是通过已有的函数来发生作用,只是传入更多的参数来简化函数的参数方面的调用。
function curry(fn) {

var args = [].slice.call(arguments, 1);
return function() {
    return fn.apply(null, args.concat([].slice.call(arguments, 0)));
}

}
function add(num1, num2) {

return num1 + num2;

}
var newAdd = curry(add, 5);
alert(newAdd(6)); //11
在curry函数的内部,私有变量args相当于一个存储器,用来暂时存储在调用curry函数时所传递的参数值,这样再跟后面动态创建函数调用时的参数合并并执行,就会得到一样的效果。
函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回函数还需要设置一些传入的参数。
function bind(fn, context) {

var args = Array.prototype.slice.call(arguments, 2);
return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs);
    return fn.apply(context, finalArgs);
};

}
创建柯里化函数的通用方式是:
function curry(fn) {

var args = Array.prototype.slice.call(arguments, 1);
return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs); retrun
    fn.apply(null, finalArgs);
};

}
curry函数的主要功能就是将被返回的函数的参数进行排序。为了获取第一个参数后的所有参数,在arguments对象上调用slice()方法,并传入参数1,表示被返回的数组的第一个元素应该是第二个参数。

相关文章
|
15天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
15天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
10 0
|
15天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
26天前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=>`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
17 5
|
1月前
|
前端开发 JavaScript 开发者
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
探索JavaScript ES6的八种常见使用技巧:开启现代编程之旅
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
17 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发
javascript箭头函数
javascript箭头函数
|
1月前
|
JavaScript 小程序
微信小程序 wxml 中使用 js函数
微信小程序 wxml 中使用 js函数
67 0