关于原生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 相关文章推荐
js对象的比较
Feb 26 Javascript
使用jQuery重置(reset)表单的方法
May 05 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
详解webpack babel的配置
Jan 09 Javascript
Vue实现日历小插件
Jun 26 Javascript
vue-cli3+typescript新建一个项目的思路分析
Aug 06 Javascript
layui use 定义js外部引用函数的方法
Sep 26 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
基于better-scroll 实现歌词联动功能的代码
May 07 Javascript
vue+springboot实现登录验证码
May 27 Vue.js
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的varchar字段的长度范围
2011/06/24 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python批量修改文本文件内容的方法
2016/04/29 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
工程安全员岗位职责
2014/03/09 职场文书
公司收款委托书范本
2014/09/20 职场文书
小学母亲节活动总结
2015/02/10 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers