在一座陌生的城市里有一群朋友的好处就是,你随时可以以任何理由叫上大家团聚,共谈理想。
函数柯里化的定义
它用于创建已经设置好了一个或多个参数的函数。(JavaScript高级程序设计第三版)。
简单使用:使用一个闭包返回一个函数
说到闭包,我们又会思考了,闭包到底是什么?用来干什么?为什么要用闭包?经典what、how、why, 那么接下来我来用一个简单的小栗子来解释吧。
var handler = {
message: '森木最帅!',
handleClick: function() {
alert(this.message);
}
};
var btn = document.getElementById('mt_btn');
EventUtil.addHandler(btn, 'click', handler.handleClick);
按照往常我们的逻辑来看这个例子应该在浏览器中弹窗内容为森木最帅!,但是其结果却是undefined。
解释:在上述例子中创建叫做handler的对象,handler.handleClick()方法被分配到一个DOM按钮的事件处理程序。当按下按钮的时候就是调用该方法的时候,由于我们没有保存函数运行的环境,所以最后this对象指向了DOM按钮而非handler,而我们DOM按钮中没有message参数的定义所以导致输出undefined
闭包解决:
var handler = {
message: '森木最帅!',
handleClick: function(event) {
alert(this.message);
}
};
var btn = document.getElementById('mt_btn');
EventUtil.addHandler(btn, 'click', function(event) {
handler.handleClick(event);
});
该解决方案在onclick事件处理程序内使用了一个闭包直接调用handler.handleClick()。当然如果多个闭包可能让代码变得难以理解和调试。因此,我们想到了bind()函数,没错就是JavaScript已经实现乐地bind()函数。我们再来简单实现下吧:
function bind(fn, context) {
return function() {
return fn.apply(context, arguments);
}
}
好的,我们现在bind()也有了,再次将上边的代码进行改装。
var handler = {
message: '森木最帅!',
handleClick: function(event) {
alert(this.message);
}
};
var btn = document.getElementById('mt_btn');
EventUtil.addHandler(btn, 'click', bind(handler.handleClick, handler));
接下来步入正题函数柯里化,继续进行简单的例子咯:
// 创建柯里化函数
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);
return fn.apply(null, finalArgs);
}
}
// 我们要执行的函数
function add(num1, num2) {
return num1 + num2;
}
var curried = curry(add, 5);
console.log(curried(3));
实际上我们所经历或者我们所学到的东西都是一环扣一环的,就比如今天这个东西,如果不是很清楚某些基础知识的话是不懂这个函数的,此时你就应该去一个一个将他们解决,那么答案自然而然地也就油然而生了。
不要抱怨所发生的不开心的事情,因为它也是你所没学到的或者没经历过的一些风景,学着去享受这种一点一点学习成长的过程,你所不甘的平凡最终也会如同繁星坠落尘埃