a、确定的输入,一定会产生确定的输出
b、函数在执行过程中,不能产生副作用
var names = ["abc", "cba", "nab", "a"];
// slice, 只要传入一个start/end
// slice函数本身不会修改原来的数组
// slice就是一个纯函数
var newNames = names.slice(0, 3);
console.log(newNames);
console.log(names);
// splice不是纯函数
var newNames2 = names.splice(2);
console.log(newNames2);
console.log(names);
// baz也不是纯函数,因为我们修改了传入的参数
function baz(info) {
info.age = 23
}
var obj = {
name: 'chen',
age: 34
}
baz(obj);
console.log(obj);
console.log('============');
// 下面这个test是纯函数
function test(info) {
return {
...info,
age: 123
}
}
test(obj)
console.log(obj);
2、柯里化
2.1、柯里化过程和代码结构
function foo(a, b, c, d) {
return a + b + c + d;
}
let f = foo(1, 2, 3, 4);
console.log(f);
// 柯里化过程
// 方式一:
function a(a) {
return function b(b) {
return function c(c) {
return function d(d) {
return a + b + c + d;
};
};
};
}
let a1 = a(1)(2)(3)(4);
console.log(a1);
// 简化上面的代码,
var bar = (a) => (b) => (c) => (d) => {
return a + b + c + d;
};
console.log(bar(10)(20)(30)(40));
var bar2 = (a) => {
return (b) => {
return (c) => {
return (d) => {
a + b + c + d;
};
};
};
};
console.log(bar(10)(20)(30)(40));
2.2、柯里化作用
1、柯里化单一原则:
function add(x, y, z) {
x = x + 2;
y = y * 2;
z = z - 2;
return x + y + z;
}
console.log(add(1, 2, 3));
// 柯里化:单一职责原则
function sum(x) {
// 业务代码一
x = x + 2;
return function (y) {
// 业务代码二
y = y * 2;
return function (z) {
// 业务代码三
z = z - 2;
return x + y + z;
};
};
}
console.log(sum(1)(2)(3));
2、柯里化-逻辑的复用:
function sum(a, b) {
return a + b;
}
// 如果我们需要把5和另外一个数字进行相加
console.log(sum(5, 11));
console.log(sum(5, 12));
console.log(sum(5, 13));
console.log(sum(5, 14));
// 柯里化
function makeAdder(count) {
return function (num) {
return count + num;
};
}
var result = makeAdder(5)(13);
console.log('result', result);
// 对上面的进行复用
var add5 = makeAdder(5)
add5(11)
add5(12)
add5(13)
3、自动柯里化函数的实现:
function add(a, b, c) {
return a + b + c;
}
function fnCurrying(fn) {
function curried(...args) {
// 判断当前已经接受的参数个数 和 参数本身需要接受的参数是否已经一致 fn.length是可以拿到函数需要的参数的长度的
// 1.当传入参数大于等于需要的参数是,执行函数
if (args.length >= fn.length) {
// fn(...args)
// fn.call(this, ...args)
return fn.apply(this, args);
} else {
// 参数不够,继续接受
function curried2(...args2) {
return curried.apply(this, [...args, ...args2]);
}
return curried2;
}
}
return curried;
}
var curryAdd = fnCurrying(add);
// add(10, 20, 30)
console.log(curryAdd(10, 20, 30));
console.log(curryAdd(10)(20)(30));
console.log(curryAdd(10, 20)(30));
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)