1. 详细代码如下:
if (!Function.prototype.bind) {Function.prototype.bind = function () {var self = this,                        // 保存原函数context = [].shift.call(arguments), // 保存需要绑定的this上下文args = [].slice.call(arguments);    // 剩余的参数转为数组return function () {                    // 返回一个新函数self.apply(context,[].concat.call(args, [].slice.call(arguments)));}}
}
2. 详解代码
2.1 bind的简单理解

    bind是用来绑定上下文的,强制将函数的执行环境绑定到目标作用域中去。与call和apply类似,但不同点在于,他不会立即执行,而是返回一个函数。因此想要自己实现一个bind函数,就必须要返回一个函数,让这个函数接受绑定的参数的上下文。

2.2 arguments

(1)定义:arguments是一个对应于传递给函数的参数的类数组对象
(2)实质是对象,typeof arguments 的结果是object。arguments对象只能在函数内部使用
(3)不是数组,类似于数组,除了length属性和索引元素之外没有任何Array属性。但是可以被转换为一个真正的数组,下图是转化为数组的4种方法

(4) 实例

2.3 [].shift.call(arguments)

(1)[].shift
  其实 Array.prototype.shift === [].shift,两者其实是同一个函数,只是调用的方式存在差异,一个是通过原型的方式直接在类上调用;一个是通过实例化,继承过来,然后再调用。
(2)call
  call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
(3)综上:[].shift.call(arguments)这条语句的含义是将arguments转化为数组,再对其运用shift方法,得到传入的参数中的第一个参数即this

2.4 返回函数
return function () {    // 返回一个新函数self.apply(context,[].concat.call(args, [].slice.call(arguments)));
}

(1)apply函数接受两个参数(第一个参数是this上下文,第二个参数是数组列表)
(2)合并参数
① 将bind 的其余参数和调用bind后返回的函数在执行的过程中接收的参数进行拼接,作为一个数组传入apply的第二个参数中去。
② args是绑定上下文的时候(也就是bind())传递的参数,而后面的arguments则是调用bind()()第二个括号传递的参数,所以这里才会需要合并
(3)如果对于合并参数还是不太明白,可以看下下面的代码

//my_bind方法不仅可以绑定对象,还可以传参
Function.prototype.my_bind = function(context){var args = Array.prototype.slice.call(arguments, 1);//args [7, 8]var self = this;return function(){var innerArgs = Array.prototype.slice.call(arguments);//innerArgs [9]var finalArgs = args.concat(innerArgs);//finalArgs [7, 8, 9]return self.apply(context, finalArgs);}
}//测试
function a(m, n, o){return this.name + ' ' + m + ' ' + n + ' ' + o;
}
var b = {name : 'kong'};
a.my_bind(b, 7, 8)(9);      //kong 7 8 9

本文参考了博文https://blog.csdn.net/lovefengruoqing/article/details/80186401,若有兴趣的小伙伴可以看看原文章。

js中自己实现bind方法及详解相关推荐

  1. go语言字符串换行_Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...

  2. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  3. js中childNodes易错点、详解定义以及用法

    js中childNodes易错点.详解定义以及用法 最近学习的时候,我遇到了childNodes的一些问题,我查阅了一些资料,总结一下其定义及用法.在学习childNodes之前,我们需要先了解一下D ...

  4. java中prepend的用法_jQuery中prepend()方法使用详解

    prepend()方法将指定元素插入匹配元素按内部的开头,其作用和prependTo()方法基本相同,只在语法上有差别,虽然说在语法形式上看基本相同. 下面介绍下语法结构: $(selector).p ...

  5. Jquery中find与each方法使用详解

    本文实例讲述了jQuery中find与each方法用法.分享给大家供大家参考.具体如下: 一.find()方法 jquery选择器非常强大,利用css的命名规约,可以更快更方便的找出想要的元素. 图解 ...

  6. JS中的事件委托/事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  7. jQuery Mobile中jQuery.mobile.changePage方法使用详解

    jQuery.mobile.changePage方法用的还是很多的.作为一个老手,有必要对jQuery mobile中实用方法做一些总结.系列文章请看jQuery Mobile专栏.jquery.mo ...

  8. php正则匹配js中变量_PHP正则表达式核心技术完全详解 第12节 [附加知识] 断言匹配...

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! 极客小俊@知乎,官方首发原创文章 博客: 极客小俊GeekerJun PHP正则中的断言 ...

  9. Lua中强大的元方法__index详解

    今天要来介绍比较好玩的内容--__index元方法 1.我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊,当然,又或许是成为过别人的备胎. 没有备胎的人,就不是完整的 ...

最新文章

  1. 监控神器Prometheus用不对,也就是把新手村的剑
  2. 8月18日 | 智能车竞赛云比赛过半,华南赛区成绩小结
  3. windows server 2012 添加中文语言包(英文转为中文)(离线)
  4. JDBC oracle 错误总结
  5. 【小代码讲解】独热编码(One-Hot编码)
  6. thriftpy2使用与流程
  7. 《剑指Offer》 二进制中1的个数
  8. java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap
  9. MySQL无法启动 服务没有报告任何错误
  10. 重装 Windows 7 系统后电脑出现乱码怎么办
  11. 教你正确设置CrossOver的Wine配置(二)
  12. 高中数学解析几何求轨迹常用的六种解题方法(实用干货)
  13. 高数篇:高等数学全目录
  14. matlab regress
  15. Linux下curses函数库的详细介绍
  16. 万事无忧之SEO GOOGLE优化秘诀
  17. 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
  18. 计算机网络 互联网模拟实验
  19. vue3加ts出现 --找不到模块“@/views/HomeView.vue”或其相应的类型声明。
  20. TCP/IP 网络协议基础入门

热门文章

  1. DataWorks值班表
  2. 一个月面试大厂,中厂,小厂的总结|2021 年中总结
  3. tankbot 机器人_优必选首款履带式Jimu机器人 TankBot 登陆Apple Store零售店
  4. 编程求解问题。 若一头小母牛,从出生起第四个年头开始每年生一头小母牛,按此规律,第n年时有多少头小母牛
  5. python中类与对象之间的关系_python类与类之间的关系
  6. 解决[FireDAC][DatS]-32. Variable length column [Name] overflow. Value length - [26], column maximum le
  7. css特效之openbox
  8. springboot 做表白墙_基于微信云开发 SayLove 表白墙微信小程序V1.0
  9. acm比赛经验(转)
  10. 让数据动起来!用Python制作动画可视化效果,让数据不再枯燥!