前言

bind函数的主要特性:

  • 创建一个新的绑定函数,这个函数与被调用的函数具有相同的函数体
  • 当这个新函数被调用的时候,函数中this 指向 bind 方法中第一个参数
  • 可以传递参数,bind 方法中传递的参数会在绑定函数实参之前

正文

实现bind函数

1、实现绑定指定this与传递参数

    'use strict';Function.prototype.mybind = function(context) {var _this = this;var outerArgs = Array.prototype.slice.call(arguments, 1);return function() {var innerArgs = Array.prototype.slice.call(arguments);return _this.apply(context, outerArgs.concat(innerArgs));}}
复制代码

2、当把返回的函数当作构造函数的时候,bind方法中第一个参数会被忽略(即不会绑定this)。

   'use strict';Function.prototype.mybind = function(context) {var _this = this;var outerArgs = Array.prototype.slice.call(arguments, 1);var BoundFn = function() {var innerArgs = Array.prototype.slice.call(arguments);// 当此时Fn函数返回出去,被当作构造函数,用new操作符调用的时候,this指向Fn的实例return _this.apply(this instanceof BoundFn ? this : context, outerArgs.concat(innerArgs));}// 把当前函数的prototype赋值给返回函数的prototypeBoundFn.prototype = this.prototype;return BoundFn;}
复制代码

3、上面的代码虽然bind功能实现了,但是存在一个问题,当改变BoundFn函数实例的原型的时候,会影响到原函数的原型,相反也一样,两者的原型是同一个引用,所以需要完善一下。

    'use strict';Function.prototype.mybind = function(context) {if(typeof this !== 'function') {throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');};var _this = this;var outerArgs = Array.prototype.slice.call(arguments, 1);var BoundFn = function() {var innerArgs = Array.prototype.slice.call(arguments);// 当此时BoundFn函数返回出去,被当作构造函数,用new操作符调用的时候,this指向BoundFn的实例return _this.apply(this instanceof BoundFn ? this : context, outerArgs.concat(innerArgs));};var Fn = function() {};fn.prototype = this.prototype;BoundFn.prototype = new Fn();return BoundFn;}
复制代码

此时bind函数已经实现了,bind函数在 ECMA-262 第五版才被加入,它可能无法在所有浏览器上运行,所以需要做下兼容:

    if(!Function.prototype.bind) {Function.prototype.bind = function(context) {if(typeof this !== 'function') {throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');};var _this = this;var outerArgs = Array.prototype.slice.call(arguments, 1);var BoundFn = function() {var innerArgs = Array.prototype.slice.call(arguments);// 当此时Fn函数返回出去,被当作构造函数,用new操作符调用的时候,this指向Fn的实例return _this.apply(this instanceof BoundFn ? this : context, outerArgs.concat(innerArgs));};var Fn = function() {};fn.prototype = this.prototype;BoundFn.prototype = new Fn();return BoundFn;}}
复制代码

javascript之实现bind相关推荐

  1. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  2. JavaScript中bind的用法

    在JavaScript中,bind()方法用于创建一个新函数,该函数在调用时将其this关键字设置为提供的值,并将其作为参数传递给bind()方法.这是一种常见的技术,通常用于在事件处理程序中更改函数 ...

  3. ios pusher使用_如何使用JavaScript和Pusher构建实时评论功能

    ios pusher使用 by Rahat Khanna 通过拉哈特·汉娜 如何使用JavaScript和Pusher构建实时评论功能 (How to build a Live Comment fea ...

  4. 移动网站开发中常用的10段JavaScript代码

    在开发移动网站过程中,有一些Javascript代码会经常用到.以下是10段常用的JavaScript代码.需要注意的是某几段代码需要jQuery mobile framework支持. 1.如果网页 ...

  5. bind、delegate、on的区别

    on(type,[data],fn) on有三个参数,type代表事件类型,可以为"click"."onchange"."mouseover" ...

  6. 【转】jQuery中的bind(),live(),delegate(),on()事件绑定方式的区别

    bind()                                                                                               ...

  7. 常用JavaScript函数 16 - 30(自我总结)

    常用JavaScript函数 1 - 15 (自我总结) 常用JavaScript函数 31- 46 (自我总结) 16. 除去数组重复项 17. 操作cookie 18. 判断浏览器类型 19. 判 ...

  8. 【进阶3-4期】深度解析bind原理、使用场景及模拟实现

    bind() bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺 ...

  9. JavaScript系列(三) - 收藏集 - 掘金

    JS 全栈教程 - 前端 - 掘金 本课程是基于阮一峰的 js 全栈教程的视频版本,免费供大家观看... 不要过度依赖 jQuery(一) - 前端 - 掘金 毫无疑问,JQuery是一款非常优秀的J ...

最新文章

  1. AI 如何推进全球可持续发展?
  2. mysql set 子表,mysql update set 更新表数据
  3. [Apple开发者帐户帮助]三、创建证书(1)证书概述
  4. Jar/War/Ear等包的作用与区别详解
  5. SLAM学习--2D激光SLAM--入门学习
  6. 数据结构:链表(c语言)
  7. centos6 5从命令行进入图形界面
  8. SNMP简单网络管理协议
  9. CSUOJ 1215: 稳定排序
  10. 韩国两名男子因偷拍汽车旅馆视频被捕 1600名房客受害
  11. Alpha版本冲刺(一)
  12. java 封装log4j_Java项目 切片实现log4j的终极封装
  13. Windows XP Embedded 官方下载地址
  14. 计算机word设置信纸,一分钟教你学会用Word做信纸和公章!
  15. 解决office2010每次打开出现配置进度的方法
  16. MySQL 检索昵称字段合法中文/日文字符对于 5.7/5.6 版本失败的解决方案
  17. linux 可道云_Aria2+KodExplorer可道云实现离线下载
  18. 前端页面复制粘贴插件Clipboard的使用
  19. 谷歌打开后开始页面被hao123篡改
  20. 4.4.1小问题集锦

热门文章

  1. logit方程怎么写_一元四次方程的常规解法
  2. python退出函数_python 退出程序的方式
  3. java 扫描包框架_在Android中实现类似Spring的软件包扫描
  4. 上职高学计算机专业好还是农林,职业高中电脑专业和大学电脑专业 有什么不同?...
  5. 怎么理解java面向对象_Java 面向对象理解?
  6. Java实用教程笔记 Java入门
  7. 漫谈时序设计(2)需要给复位足够的关心!
  8. 【 FPGA 】FIR 滤波器的架构
  9. 用行为级描述方式实现一个加法器电路(基于ISE的设计)(2输入1位全加器电路)
  10. 微软发布新的Azure Pipelines功能和集成