您的位置:首页 > Web前端 > JavaScript

javascript函数科里化

2015-09-15 18:07 537 查看
函数科里化(Currying)是指是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

下面的这个函数就是函数科里化的一个很好的解释:

function sum(x,y) {
if (x != undefined && y != undefined) {
return x + y;
}
else if (x != undefined && y == undefined) {
console.log("x=" + x);
return function(y) {
return x + y;
}
}
else {
console.log("y=" + y);
return function(x) {
return x + y;
}
}
}
console.log(sum(2,3));  // 5
console.log(sum(2)(3)); // 5(会有console出"x=2")
console.log(sum(undefined,10)(90)); // 100(会有console出"y=10")


上面的就是函数科里化, 当sum()只接收到一个参数的时候,会把这一个函数赋值给x,所以sum(2)返回的是一个函数(该函数的活动对象包括sum的活动对象),

在给所返回的函数传值就,会把传入的值赋值给y,执行函数,返回x+y

下面的函数是一个通用的科里化函数的函数

ps:

1.说明一下arguments.length函数名.length的区别

function test(){
console.log(test.length);
console.log(arguments.length);
}
test(10,11);


个人理解: arguments.length是实参的个数,函数名.length是形参个数

2. arguments是类数组对象,所以arguments不继承Array.prototype,没有数组的一些操作方法

3. slice() 数组的操作方法,返回的是数组的一个子集

4. call(null)或者call(undefined) 在非严格模式下,在浏览器中相当于call(window),严格模式下call(null)就是在null下,call(undefined)就是在undefined下; apply、bind同理

function Currying(fun) {
return function() {
var args = Array.prototype.slice.call(arguments,0);
// 为arguments添加一个slice()方法
if (args.length < fun.length) {
return function(){
var newargs = args.concat(Array.prototype.slice.call(arguments,0));
return Currying(fun).apply(null,newargs);
// 递归使函数的形参和实参个数保持一致
}
} else {
return fun.apply(undefined,args); // [这里的this在浏览器里是window,node环境下global]
// 形参和实参个数一致时执行fun
}
}
}
function foo(x,y,z) {
console.log(this);
console.log(x + y + z);
}
var test = Currying(foo);
test(1)(2)(3);
test(2,3)(4);


ECMAScript 5的bind()方法就可以做到将函数科里化

function foo(x,y,z){
console.log(x + y + z);
}
var fun = foo.bind(this,10);  // fun的x已经被绑定为了10
fun(10,10);   // 30
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: