# 函数
# 闭包
闭包 = 函数+与其相关的引用环境组成。
一般我们在函数内部定义新函数,这个新函数可以访问到外层的变量和参数,这些变量和参数不会随着函数的执行完毕而销毁,这 个新函数和外部的变量参数统称为闭包。
闭包属于高阶函数
function clo(x) {
return function () {
return x++;
};
}
// x变量并不会销毁
const c = clo(1);
console.log(c()); // 1
console.log(c()); // 2
console.log(c()); // 3
优点:缓存变量,进行封装,实现状态共享和保存。同时私有化变量,避免污染作用域。
缺点:内存过大,内存泄漏。
例子:防抖,操作私有变量
# 高阶函数
- 函数作为参数
[1, 2, 3].filter((v) => {
return v % 2 === 0;
});
- 函数作为返回值
function add(a) {
return function (b) {
return a + b;
};
}
const sum = add(1);
console.log(sum(2)); // 3
console.log(sum(3)); // 4
# 柯里化函数
当一个函数有多个参数时,可以改造成先传递一部分参数调用,然后返回一个新的函数接受剩余的参数,最后返回结果
function sum(a, b, c, d) {
return a + b + c + d;
}
function curry(fn) {
return function c(...args) {
// 判断参数是否一致
// fn.length 形参
// args.length 实参
if (fn.length > args.length) {
return function () {
return c(...args.concat(Array.from(arguments)));
};
}
// return fn.apply(null,args);
return fn(...args);
};
}
const getSum = curry(sum);
console.log(getSum(1, 2)(3)(4)); // 10