关于原生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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
BootStrap和jQuery相结合实现可编辑表格
Apr 21 Javascript
JavaScript重载函数实例剖析
May 13 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
vue.js单页面应用实例的简单实现
Apr 10 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 Javascript
tracking.js页面人脸识别插件使用方法
Apr 16 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 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基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
跟老齐学Python之用while来循环
2014/10/02 Python
Python 的描述符 descriptor详解
2016/02/27 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
电大自我鉴定范文
2013/10/01 职场文书
实习评语
2013/12/16 职场文书
户外婚礼策划方案
2014/02/08 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
超市主管竞聘书
2015/09/15 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技