高阶函数?
- 两种应用方式可称之为高阶函数
- 函数内部返回一个函数,外层函数可以叫做高阶函数
function A() {
return function () {};
}
- 函数的参数是一个函数,也是高阶函数
function A(B) {
B();
}
举一个应用场景 (AOP)
- AOP:即面向切面编程,可以理解为不动原有业务逻辑,额外增量扩展功能
// DEMO
function core(...args) {
// 这是原有业务,我们希望不动这个原有业务,增量扩张,此时用到AOP的思路
// 我想在这扩展......
console.log(args); // 原业务
// 我想在这扩展......
}
前置功能扩展
Function.prototype.before = function (cb) {
return (...args) => {
cb(); //额外以回调函数(高阶函数)方式扩展了一个前置功能
this(...args); // this是谁?箭头函数不存在this,所以当前尖头函数没有怎么办?往上找...this最终指向调用者,也就是core
};
};
后置功能扩展
Function.prototype.after = function (cb) {
return (...args) => {
this(...args);
cb(); // 额外以回调函数方式(高阶函数)扩展一个后置功能
};
};
调用
let newFunc_before = core.before(() => {
console.log("before");
});
let newFunc_after = core.after(() => {
console.log("after");
});
newFunc_before(1, 2, 3);
newFunc_after("a", "b", "c");
疑问?闭包是高阶函数吗?
- 嗯…闭包确实是一个高阶函数,满足上述两个条件之一,即算高阶函数
附录:何为闭包?
// 一个函数定义和执行不在一个作用域必然形成闭包
function package() {
return function () {};
}
// 典型闭包,一旦调用
- package(); // 执行的其实是内部函数,package内部函数一直在被使用package就不会被回收(gc原理),所以才有闭包。