关于原生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 相关文章推荐
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 jQuery
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 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 的Opcache加速的使用方法
2017/12/29 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
Python常用库大全及简要说明
2020/01/17 Python
python实现井字棋小游戏
2020/03/04 Python
python实现IOU计算案例
2020/04/12 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
工作会议方案
2014/05/21 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
党校党性分析材料
2014/12/19 职场文书
倡议书作文
2015/01/19 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL