• javascript之复习(框架里的方法们)


    继上次整理,一些东西没有整理完。就写在这。可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度。

    1.String.repeat()

    大家要实现重复一个字符串的重复怎么写呢,反正我的第一想法就是:

    function repeat(str,n){
        var sum='';
        for (var i = 0; i <n; i++) {
            sum+=str;
        };
        return sum;
    }
    console.log(repeat('ab',3));

    其实优化就是把多于的变量消除,多了一个sum变量,总是不太好的,然而人家想的总是比较好的,内置的方法,没有中间变量:

    function repeat(target,n){
        return (new Array(n+1)).join(target);
    }
    function repeat(target,n){
        return [].join.call({length:n+1},target)
    }

    这是某框架里的,像这样的函数其实蛮多的,作者这代码的质量一看就…


    中间休息分享兼容问题:

    unshift ie6.7下不返回长度

    splice一个参数的情况下,ie6、7、8默认为0,其他浏览器默认为数组length


    2.bind()

    bind经常用在本地上下文下调用非本地上下文的函数,跟apply,call差不多,其实源码就是封装了apply:

    Function.prototype.bind = function(context) {
        if (arguments.length<2&&context==void 0) { //context为空返回this
            return this;
        }
        var __method=this,args=[].slice.call(arguments,1);//取到context后面的参数
        return function(){                                //执行此方法,传入context环境
            return __method.apply(context,args.concat.apply(args,arguments));
        }
    }

    3.柯里化函数curry

    function curry(fn){
        function inner(len,arg){
            if (len==0) {
                return fn.apply(null,arg)
            };
            return function(x){
                return inner(len-1,arg.concat(x));
            }
        }
        return inner(fn.length,[])
    }

    一个函数返回另一个函数,第一个参数是参数的长度,没返回一次length-1,剩下的参数原封不动的扔给返回的函数,再加上新给的参数;

    原本的一个

    function sum(x,y,z,w){
        return x+y+z+w;
    }
    //柯里化调用
    curry(sum)('a')('b')('c')('d');

    sum函数,柯里化之后就可以改变参数的传递方式,thunk也是差不多。

    如果用户想传入多个参数怎么办?那我们改进一下curry:

    function curry2(fn){
        function inner(len,arg){
            if (len<=0) {
                return fn.apply(null,arg)
            };
            return function(){
                return inner(len-arguments.length,arg.concat(Array.apply([],arguments)))
            }
        }
        return inner(fn.length,[])
    }
    curry2(sum)()('b','c')('d')//'bcd'

    把length依次-1改成参数减参数的长度,就能实现;

  • 相关阅读:
    [日常训练]大灾难
    [cf235D]Graph Game
    [日常训练]选课
    [日常训练]挂科
    [学习笔记]概率&期望
    [日常训练]yayamao的神题
    [学习笔记]原根
    LOJ#2132. 「NOI2015」荷马史诗
    LOJ#2131. 「NOI2015」寿司晚宴
    LOJ#2129. 「NOI2015」程序自动分析
  • 原文地址:https://www.cnblogs.com/dh-dh/p/5083746.html
Copyright © 2020-2023  润新知