js模拟bind/call / apply/curry 的实现

522 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

u=1860727157,3955454205&fm=253&fmt=auto&app=138&f=JPEG.webp

从2017年毕业后,就从事了前端开发。从最开始的javaScript/html/css,就写一些静态页面加一些css效果以及简单的js事件。再到jquery,这里就简化了很多js操作语句,jquery封装了很多方法,尤其是$这个变量,挂载到window上,因为其方便易用,简洁好记,让还是小白阶段的我舍弃了js,从此用上jquery。再到angular,不过这个语言只是了解,因为出现了更好用的vue。从此开始了vue养成之路。

期间小程序的语言也是在不断迭代,从最开始的wxml/wxss/js/json进行开发,再到wepy框架开发,再到mpvue框架开发,最后到现在使用中的mpx框架进行小程序的开发。uniapp用来随手练习了一下,当时app和小程序有2套,就考虑了用uniapp。

编程软件从最开始的dreamweaver到notepad,再到webstoram,最后稳定为vscode。

不得不说,前端涉及到的东西是真广,入门是真的简单,深入是真的需要时间来慢慢的积累。

好了,开始正题,bind,call,apply都是可以用来改变this的指向。区别在于它们的传参是不同的,call/bind/apply 这三个函数的第一个参数都是 this 的指向对象。call的传参的第二个以及后面的若干个形参;apply的传参的第二个参数是一个数组,数组里面可以包括若干个形参;bind 除了返回是函数以外,它的参数和call一样。

Function.protype.mycall = function(context,...arg){
    if(typeof this !== 'function'){
       throw new typeError('typeerror')
    }
    context = context || window
    context.fn = this
    let res
    res = context.fn(...arg)
    delete context.fn
    return res
}



  Function.protype.myapply = function(context,...arg){
    if(typeof this !== 'function'){
       throw new typeError('typeerror')
    }
    context = context || window
    context.fn = this
    let res
    res = context.fn(...arg.flat())
    delete context.fn
    return res
}


  Function.protype.mybind = function(context,...arg){
    if(typeof this !== 'function'){
       throw new typeError('typeerror')
    }
    let _this = this
    return function(...rest){
        _this.call(context,...arg,...rest)
    }
}

柯里化的实现

  function curry(fn){
      rertun function f(...arg){
          if(arg.length >= fn.length){
              return fn(...arg)
          }
          return function(..._arg){
              return f(...[...arg,..._arg])
          } 
      }
  }  
  
  
  
  //实现方式2
  
  const curry = (fn,...args)=>{
      return args.length >= fn.length ? fn(...args) : (..._args)=>curry(fn,...args,..._args)
  }
    

闭包

闭包最常见的解释就是 上局作用域的变量因为下局作用域中有相关的引用,导致变量不会被释放掉。

最常见的应用场景就是 防抖,节流,for循环的引用。 下一篇文章就写防抖、节流、promise。

路漫漫其修远兮,每天进步一小步。