关于原生js中bind函数的简单实现


Posted in Javascript onAugust 10, 2016

今天继续研究了bind函数的实现,也知道了shim和polyfill的说法,现在总结一下,

if (!Function.prototype.bind) {
 Function.prototype.bind = function (oThis) {
  if (typeof this !== "function") {
   // closest thing possible to the ECMAScript 5 internal IsCallable function
   throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
  }

  var aArgs = Array.prototype.slice.call(arguments, 1), 
    fToBind = this, 
    fNOP = function () {},
    fBound = function () {
     return fToBind.apply(this instanceof fNOP && oThis
                 ? this
                 : oThis || window,
                aArgs.concat(Array.prototype.slice.call(arguments)));
    };

  fNOP.prototype = this.prototype;
  fBound.prototype = new fNOP();

  return fBound;
 };
}

这是官方文档上的实现,我分二个方面来谈我要说的东西,

第一个是参数,agruments的使用

var aArgs = Array.prototype.slice.call(arguments, 1),这里是将bind函数的参数数组取出来,第一个参数不要(就是不要oThis)也就是要被绑定方法的那个对象,第二个是

aArgs.concat(Array.prototype.slice.call(arguments))); 这里是用了数组的方法,把参数插在参数数组后面,要注意,这个函数是要被return 出去然后执行的,他的参数数组是return出去的那个fBound函数的参数数组,所以上下两个参数数组是不一样的,有点像柯里化。

第二个是上下文,在其中上下文的变化比较难理解,bind函数主要就是为了绑定上下文来使用的

fToBind = this 这里是保存了对象的上下文,紧接着下面的apply方法让要被绑定的那个对象可以使用该上下文

fNOP.prototype = this.prototype;

fBound.prototype = new fNOP();

这里是以fNOP为中介把this.prototype这个原对象的属性给fBound,确保fBound是在定义的时候的那个上下文里面执行。本来

bound.prototype = self.prototype就可以将原属性集成过来了,但是这样两个对象属性都指向同一个地方,修改 bound.prototype 将会造成self.prototype 也发生改变,这样并不是我们的本意。所以通过一个空函数 nop 做中转,能有效的防止这种情况的发生。

以上这篇关于原生js中bind函数的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 插件 任意位置浮动固定层
Dec 25 Javascript
改善用户体验的五款jQuery插件分享
May 22 Javascript
JavaScript的递归之递归与循环示例介绍
Aug 05 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Oct 24 Javascript
Javascript模块化编程详解
Dec 01 Javascript
javascript中字体浮动效果的简单实例演示
Nov 18 Javascript
JavaScript构造函数详解
Dec 27 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
Aug 05 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
Jan 10 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
Aug 22 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
javascript+css实现进度条效果
Mar 25 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 #Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 #Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 #Javascript
浅谈jQuery中的checkbox问题
Aug 10 #Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 #Javascript
Three.js学习之网格
Aug 10 #Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 #Javascript
You might like
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
基于python操作ES实例详解
2019/11/16 Python
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
医科学校毕业生自荐信
2013/11/09 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
会计专业个人求职信范文
2014/01/08 职场文书
最美家庭活动方案
2014/08/31 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
思品教学工作总结
2015/08/10 职场文书
田径运动会广播稿
2015/08/19 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers