高阶函数以及多个高阶函数嵌套
高阶函数:以另一个函数作为参数的函数
例子:封装一个 map 方法
1 | let arr=[1,2,3]; |
注意,map
方法的第二个参数作为第一个函数的this
对象,如果未传入,函数的 this 指向按照函数的类型,是否严格模式等情况讨论,
参见:JS-this 指向
实现
1 | Array.prototype._map=function(fun,context){ |
代码组合
高阶函数 widthLogin,判断用户状态
登录判断模块
1 | const getLogin=function(){ |
主页
1 | const withLogin=window.withLogin; |
其他模块,处理方法相同,都是在外面包一层 withLogin
如果还需要一个高阶函数判断当前系统的运行环境
1 | (function(){ |
此时主页函数调用方法
1 | window.renderIndex = withLogin(withEnvironment(renderIndex)); |
compose
方法从右至左,将第一个参数renderIndex
作为第二个参数withEnvironment
的参数,并将运行结果作为第一个参数的参数,并且最后返回一个新的函数,这个函数拥有两个高阶函数的功能。
1 | window.renderIndex = compose(withLogin, withEnvironment, renderIndex); |
实现方法
1 | function compose(...args) { |
验证
1 | var fn1 = function (a) { |
上一个函数的运算结果作为下一个函数的参数,这种逻辑与reduce
相似。
利用reduce
实现compose
1 | function compose(...args) { |
借助科里化封装得更加灵活
1 | window.renderIndex = compose(withLogin, withEnvironment, renderIndex); |
利用lodash.js
中是的flowRight
来实现
1 | // ES6 模块化语法,引入flowRight函数 |