• JavaScript-bind实现原理


    大家好,今天给大家带来的是bind的实现原理,比前两个call,apply稍微有点点难,但是大家想要玩转js高级,那就当然是模仿各种的实现原理,对自己的js理解啥的提升挺快的,bind的话,想必大家知道:作用就是改变this指向,不调用函数没,这个跟前两个有些不一样下面我就带大家来写一下bind的实现原理:(在实现bind的原理之前我们先看一下原生的是啥样的然后我们去模仿一下)

    1. function fn(num1.num2){
    2. console.log(this)
    3. return num1+num2
    4. }
    5. let obj={
    6. name:'张三'
    7. }
    8. let abc=fn.bind(obj,1)
    9. console.log(abc(2))

    上面写完我们发现结果是这样的:

    1. { name: 'obj' }
    2. 3

    我们发现this指向了我们输入的对像,然后函数结果输出为3.下面我们就开始写自己的函数myBind:

    1. ;(function(){
    2. Function.prototype.myBind=function myBind(context){
    3. }
    4. }())

    大家可以看到上面我们创建一个自调函数以及把一个myBind函数绑定到了原型链上,下面我们实现第一步就是不但可以在使用bind函数的时候可以传参,还可以在函数调用的时候进行传参,要想实现这个功能,我们应该写成闭包的形式,大家想在外曾获得外层的参数,内层获得调用函数的参数对吧下面我们来试一下我们的猜想:

    1. ;(function(){
    2. Function.prototype.myBind=function myBind(context){
    3. console.log(context)
    4. return (...args)=>{
    5. console.log(args)
    6. }
    7. }
    8. }())

    我们发现都分别获得到了bind函数插入的值以及函数调用传入的值,既然解决这个问题,那我们就解决了最难的一步,下面的一步就相当于我们上节讲的apply的实现方法了下面我们开始书写代码:

    1. ;(function(){
    2. Function.prototype.myBind=function myBind(context){
    3. const bindArgs = Array.prototype.slice.call(context,1)
    4. return (...args)=>{
    5. 因为我们第二层写的是箭头函数所以不用担心this指向的问题
    6. let bindArr=bindArgs.concat(...args)
    7. context.fn=this
    8. let fn=context.fn(...bindArr)
    9. delete context.fn
    10. return fn
    11. }
    12. }
    13. }())

    上面我们就模拟完了bind的方法我们来打印一下看一下结果:

    1. { name: 'obj', fn: [Function: fn] }
    2. 3

    发现结果没有问题,其实js 的一些原理挺简单的,当我们学会写原理之后js高级的一些东西,就发现会幡然醒悟,奥原来是这样。这期文章就到这里啦,谢谢大家,喜欢的可以点个赞感谢各位!!!

  • 相关阅读:
    idea的debug调试
    一、软件/软件工程/软件开发模型概述
    把备考高项当成项目:我的信息系统项目管理师项目实施方案
    产品生命周期有哪些
    leetcode 每日一题目 (树的直径 +DFS的深刻理解)
    Numpy 的 random 函数总结
    springMvc注解式开发方法以及参数传递方法
    【Android笔记32】Android中数据存储技术之SQLite事务操作以及存储大文件
    《OpenDRIVE1.6规格文档》6
    解决webpack报错:You forgot to add ‘mini-css-extract-plugin‘ plugin
  • 原文地址:https://blog.csdn.net/weixin_59554510/article/details/126530600