关于原生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的高性能TreeView(asp.net)
Feb 23 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
javascript创建动态表单的方法
Jul 25 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
Bootstrap模仿起筷首页效果
May 09 Javascript
jquery常用的12个小功能
Jul 22 Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
深入对Vue.js $watch方法的理解
Mar 20 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
Aug 16 Javascript
微信小程序商品详情页的底部弹出框效果
Nov 16 Javascript
如何用JS实现简单的数据监听
May 06 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
js以对象为索引的关联数组
2010/07/04 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
python利用拉链法实现字典方法示例
2017/03/25 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python模块文件结构代码详解
2018/02/03 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
出生证明格式
2015/06/15 职场文书
工程进度款催款函
2015/06/24 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript