关于原生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 HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
Oct 15 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
7个jQuery最佳实践
Jan 12 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
Jan 24 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
express+mockjs实现模拟后台数据发送功能
Jan 07 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
js基础语法与maven项目配置教程案例
Jul 15 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的api数据接口书写实例(推荐)
2016/09/22 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
用Python写冒泡排序代码
2016/04/12 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
python进行两个表格对比的方法
2018/06/27 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
python地震数据可视化详解
2019/06/18 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
python实现马丁策略的实例详解
2021/01/15 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
酒店服务实习自我鉴定
2013/09/22 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
商场消防安全责任书
2014/07/29 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
教师教育心得体会
2016/01/19 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
Python的这些库,你知道多少?
2021/06/09 Python