一、简单题目add (a,b)改写add(a)(b)
// 普通的add函数
function add(x, y) {
return x + y
}
add(1,2);
carray之后:
//carry
function add (x) {
return function(y) {
return x + y;
}
}
add(2)(3)
二、函数柯里化通用函数
答:
function add(...args) {
return args.reduce((sums, i) => sums + i);
}
function carrying(fn, ...args1) {
return function (...args2) {
return fn.call(this, ...args1, ...args2);
}
}
carrying(add,1)(2);
三、实现bind函数
Function.prototype.bind = Function.prototype.bind ||
function (context, ...args1) {
var _this = this
return function(...args2) {
return _this.call(context, ...args1, ...args2)
}
}
// bind,实现的机制就是Currying.
扩展:Bind()的应用
题目:
var a = {
name: 'a',
getName: function () {
console.log(this.name);
}
}
var b = {
name : 'b'
}
var c = {
name: 'c'
}
var fn1 = a.getName.bind(b);
var fn2 = a.getName.bind(b).bind(c);
问:执行下面语句分别打印什么
fn1();
fn2();
a.getName();
答:
VM61:4 b
VM61:4 b
VM61:4 a
四、多参数调用
1.形如:carryAdd(a),curryAdd(b),curryAdd(c),curryAdd();
答1
var currying = function (fn, ...args1) {
var args = [...args1] || [];
var self = this;
return function (...args2) {
if (args2.length === 0) {
return fn.apply(self, args);
} else {
args.push(...args2);
return currying.call(self, fn, ...args);
}
}
};
答2:
var currying = function (fn, ...args1) {
var args = [...args1] || [];
return function () {
if (arguments.length === 0) {
return fn.apply(this, args);
} else {
args.push(...arguments);
return arguments.callee;
}
}
};
形如:carryAdd(a)(b)(c);
var args = [].slice.call(arguments);
return args.reduce((sums, i) => sums + i);
}
var currying = function (fn, ...args1) {
var args = [...args1] || [];
var self = this;
return function (...args2) {
args.push(...args2);
if (args.length >= fn.length) {
return fn.apply(self, args);
}
return currying.call(self, fn,...args)
}
}
currying(add, 1)(2)(3)
function add(x, y, z) {
var args = [].slice.call(arguments);
return args.reduce((sums, i) => sums + i);
}
var currying = function (fn, ...args1) {
var args = [...args1] || [];
return function () {
args.push(...arguments);
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return arguments.callee;
}
}
};
currying(add, 1)(2)(3)
五、编程题
1.题目
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
function add(...args1) {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = [...args1];
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function () {
_args.push(...arguments);
return _adder;
};
// 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce( (a, b) => a + b);
}
return _adder;
}
题2:sum(1)(2)(3).valueOf()
function sum(...args1) {
var args = [...args1] || [];
var innerfn = function (...args2) {
args.push(...args2);
return innerfn;
}
innerfn.valueOf = function () {
return args.reduce((items, item) => items + item);
}
return innerfn;
}