手写一个🍏🍏🍏

写一个call🍏

模拟一个call方法查看

Function.prototype.myCall = function (context) {
     // 挂在一个fn函数
    var context = context || window;
    context.fn = this
     // 执行该函数
    let args = [...arguments].slice(1)
    let result = context.fn(...args)
    // 删除该函数
    delete context.fn
    // 返回结果
    return result
}

写一个apply🍏

模拟一个apply方法查看

Function.prototype.myApply = function(context){
        // 挂载一个函数
    var context = context || window
    context.fn = this
        // 执行该函数
    let args = arguments[1]
    let result;
    args ? result = context.fn(...args) : result = context.fn()
        // 删除该函数
    delete context.fn
        // 返回结果
    return result
}

写一个bind🍏

柯里化🍏

柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。
如果要实现下面这个方法:
add(1, 2)(3)(4)(5, 6, 7)(9)()
上面这个函数当参数为空的时候执行了内部参数所有值的相加,所以我们应该考虑当参数不为空的时候将缓存起来,在为空的时候再相加,这样的思路会用闭包的方式来实现。下面是实现方法:

function add(){
    // 缓存所有的arguments值
    let args = [...arguments]
    // 新建fn函数实现柯里化
    let fn = function (){
            // 如果参数为空,那么递归停止,返回执行结果
         if (arguments.length === 0){
             return args.reduce((a,b) => a + b)
         } else {
             // 否则将参数保存到args里面,返回fn方法
             args.push(...arguments)
             return fn
         }
    }
    return fn
}
add(1, 2)(3)(4)(5, 6, 7)(9)() // 37

   转载规则


《手写一个🍏🍏🍏》 echo丶若梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
delete的用法 delete的用法
delete 是项目中使用频率并不很高的一个操作,书上写delete操作符要谨慎使用,因为大多数现代js引擎会针对构造函数创建的实例进行性能优化,而delete会破坏这种优化。 例题看下题最后输出的是什么 function Fn(obj){
2021-03-15
下一篇 
前端监控和前端埋点 前端监控和前端埋点
前端监控和前端埋点,一个是目的,一个是实现方式,做前端埋点,是为了做前端监控,那为什么要做前端监控呢? 前端监控的目的是: 获取用户行为以及跟踪产品在用户端的使用情况,并以监控数据为基础,指明产品优化的方向。 前端监控前端监控可以分
2020-09-18
  目录