美文网首页
函数式编程

函数式编程

作者: 阿凯_8b27 | 来源:发表于2020-04-01 10:22 被阅读0次

    // 函数式编程思想
    /**

    • 把函数当成普通数据类型来看待,可以存放再数组里,当做参数传递,赋值给变量

    *给函数起正确的变量

    **/

    const BlogController = {
      index(posts) { return Views.index(posts); },
      show(post) { return Views.show(post); },
      create(attrs) { return Db.create(attrs); },
      update(post, attrs) { return Db.update(post, attrs); },
      destroy(post) { return Db.destroy(post); },
    };
    
    //优化
    const BlogController1 = {
      index: Views.index,
      show: Views.show,
      create: Db.create,
      update: Db.update,
      destroy: Db.destroy,
    };
    

    /*

    • 纯函数,相同的输入,永远返回相同的输出,注意 数组和Json 对象的处理
    • 建立缓存,优化性能
    • 可移植性/自文档化
    • 可测试性
    • 合理性
      */
    var memoize = function(f) {
      var cache = {};
    
      return function() {
        var arg_str = JSON.stringify(arguments);
        cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
        return cache[arg_str];
      };
    };
    

    /*

    • 函数柯里化
    • 通过函数返回函数,
    • 可以缓存参数
    • 高阶函数
      */
    function curryMain(append) {
        var arr = [];
        return function reply() {
            var arg = Array.prototype.slice.call(arguments);
            arr = arr.concat(arg);
            if (arg.length === 0) { // 递归结束条件,修改为 传入空参数
                return append(arr);
             } else {
                 return reply;
             }
    

    /*

    • 函数组合,通过将多个纯函数进行拼接组合,从右到左或者从左到右,依次调用
      */
    var compose = (...args) => x => args.reduceRight((value, item) => item(value), x);
    

    /**

    */

    简单例子

     /** 刷新事件
             * @param {Object}  val 视图信息
             * @returns {null} 无
             */
            getRefreshData(val){
                const refresh = (number) => {
                    return 1;
                }
                this.pageChange(val, refresh)
            },
            /** 向前翻页
             * @param {Object}  val 视图信息
             * @returns {null} 无
             */
            getPrePageData(val){
                const getPre = (number) => {
                    return number - 1;
                }
                this.pageChange(val, getPre)
            },
            /** 向后翻页
             * @param {Object}  val 视图信息
             * @returns {null} 无
             */
            getNextPageData(val){
                console.log(val)
                const getNext = (number) => {
                    return number + 1;
                }
                this.pageChange(val, getNext)
            },
      /**基于页数变化函数,来进行检索
             * @param {Object} val 视图信息
             * @param {Function} fn 处理页数的函数
             * @returns {null} 无
             */
            pageChange(val, fn){
                const { code } = val;
                const num = this.manuScriptData.find(manuScript => manuScript.code == code);
                num.pageData.currentPage = fn(num.pageData.currentPage);
                this.searchManuScript(code, num.pageData.currentPage - 1);
            },
    ----------------------------------------------------------------------
    比如: 现在有个音乐播放器,要放歌 具体实现函数省略
    var player = getplayer();  //找到播放者
    var gedan = compose(getGedan(),player ) //找到歌单
    var ge = compose(getGe(), gedan)//找到歌
    var bofa = compose(getBofa(), ge) //播放歌
    

    /*

    • 声明式编程 通过函数组合,curry等高级函数,依次返回自己想要的结果,使得代码整洁

    */

    
    // 声明式
    var makes = cars.map(function(car){ return car.make; });
    ENUM_NO1_TAG_GROUP_KEY.map(key => result[key])
                    .filter(Boolean)
                    .join()
    

    尾递归优化
    递归中返回函数,占用内存空间少

    相关文章

      网友评论

          本文标题:函数式编程

          本文链接:https://www.haomeiwen.com/subject/mcbpoctx.html