1、理解JS纯函数
- (1)若一个函数符合以下条件,那么这个函数被称为纯函数:
①此函数在相同的输入值时,需产生相同的输出 ②此函数在执行过程中,不能产生副作用
(诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等) - (2)副作用的理解 表示在执行一个函数时,除了返回函数值之外,还对调用函数产生
了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储。
例如:
①slice:slice截取数组时不会对原数组进行任何操作,而是生成一个新的数组 (slice是纯函数)
②splice:splice截取数组, 会返回一个新的数组, 也会对原数组进行修改(splice不是纯函数)
var names = ["abc", "cba", "nba", "dna"];
// slice函数本身就是一个纯函数
var newNames1 = names.slice(0, 3);
console.log(newNames1); //[ 'abc', 'cba', 'nba' ]
console.log(names); //[ 'abc', 'cba', 'nba', 'dna' ]
//原数组没有被修改
// splice在执行时, 会修改掉调用的数组对象本身,
//修改的这个操作就是产生的副作用
// splice不是一个纯函数
var newNames2 = names.splice(2);
console.log(newNames2); //[ 'nba', 'dna' ]
console.log(names); //[ 'abc', 'cba' ] 原数组被修改
2、JS柯里化
- 柯里化过程:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数,这个过程就称之为柯里化;
//未柯里化代码
function add(x, y, z) {
return x + y + z;
}
var result = add(10, 20, 30);
console.log(result); //60
//柯里化代码
function sum1(x) {
return function (y) {
return function (z) {
return x + y + z;
};
};
}
var result1 = sum1(10)(20)(30);
console.log(result1); //60
// 简化柯里化的代码
var sum2 = (x) => (y) => (z) => {
return x + y + z;
};
console.log(sum2(10)(20)(30)); //60
var sum3 = (x) => (y) => (z) => x + y + z;
console.log(sum3(10)(20)(30)); //60
3、柯里化作用
- (1)让函数的职责单一:将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果
function sum(x) {
x = x + 2
return function(y) {
y = y * 2
return function(z) {
z = z * z
return x + y + z
}
}
}
console.log(sum(10)(20)(30)) //952
- (2)①柯里化的复用
function makeAdder(count) {
count = count * count
return function(num) {
return count + num
}
}
var adder5 = makeAdder(5);
console.log(adder5(10)); //25+10=35
console.log(adder5(14)); //25+14=39
- ②打印日志的柯里化
//未使用柯里化
function log(date, type, message) {
console.log(
`[${date.getHours()}:${date.getMinutes()}][${type}]:
[${message}]`
);
}
log(new Date(), "DEBUG", "查找到轮播图的bug");
//[17:11][DEBUG]: [查找到轮播图的bug]
log(new Date(), "DEBUG", "查询菜单的bug");
//[17:11][DEBUG]: [查询菜单的bug]
// 柯里化的优化
var log = (date) => (type) => (message) => {
console.log(
`[${date.getHours()}:${date.getMinutes()}][${type}]:
[${message}]`
);
};
// 如果我现在打印的都是当前时间
var nowLog = log(new Date());
nowLog("DEBUG")("查找到轮播图的bug");
//[17:12][DEBUG]: [查找到轮播图的bug]
nowLog("FETURE")("新增了添加用户的功能");
//[17:12][FETURE]: [新增了添加用户的功能]
// 如果我现在打印的都是当前时间和DEBUG
var nowAndDebugLog = log(new Date())("DEBUG");
nowAndDebugLog("查找到轮播图的bug");
//[16:36][DEBUG]: [查找到轮播图的bug]