今天群里有人问一个js问题,现列出以便其他人参考。
Function.prototype.curry=function(){ var slice=Array.prototype.slice, args=slice.apply(arguments), that=this; return function(){ console.log(args.concat(slice.apply(arguments))) return that.apply(null, args.concat(slice.apply(arguments)) ); } } function add(a,b){ return a+b; } var q=add.curry(10); q(2)
这里我将代码改变了一下,便于解析:(其实就是:函数与传递给它的参数组合产生新函数。)
改变:
Function.prototype.curry=function(){ var slice=Array.prototype.slice, args=slice.apply(arguments),// 参数变为数组,以便使用concat that=this; return function(){ var param = slice.apply(arguments).concat(args); console.log(param) return that.apply(null, param ); } } function add(a,b){ return a+b; } var q=add.curry(10); q(2)
分析:
首先add.curry(10);,curry最终返回了一个function,并且这个function是闭包(因为内部使用的变量名是上面的add的变量,即引用了但不释放变量):
var slice=Array.prototype.slice;//将要使用slice方法,这里简写引用
args=slice.apply(arguments),// add函数的参数变为数组,以便使用数组的concat方法
that=this;//存放add的引用。。
执行q(2)则内部执行过程:
var param = slice.apply(arguments).concat(args);显然这里slice和args都是add函数的引用(闭包用上了),而arguments则是q的参数。含义:q的参数调用数组的slice方法,然后与前面保存add的args数组进行连接。
return that.apply(null, param ); 现在新数组[2,10]作为参数调用add的方法(that的引用),返回结果。