ECMAScript5(ES5)中bind方法使用小结


Posted in Javascript onMay 07, 2015

一直以来对和this有关的东西模糊不清,譬如call、apply等等。这次看到一个和bind有关的笔试题,故记此文以备忘。

bind和call以及apply一样,都是可以改变上下文的this指向的。不同的是,call和apply一样,直接引用在方法上,而bind绑定this后返回一个方法,但内部核心还是apply

直接看例子:

var obj = {

  a: 1,

  b: 2,

  getCount: function(c, d) {

    return this.a + this.b + c + d;

  }

};

 

window.a = window.b = 0;

console.log(obj.getCount(3, 4));  // 10

var func = obj.getCount;

console.log(func(3, 4));  // 7

为何会这样?因为func在上下文中的this是window!bind的存在正是为了改变this指向获取想要的值:

var obj = {

  a: 1,

  b: 2,

  getCount: function(c, d) {

    return this.a + this.b + c + d;

  }

};

 

window.a = window.b = 0;

var func = obj.getCount.bind(obj);

console.log(func(3, 4));  // 10

bind是function的一个函数扩展方法,bind以后代码重新绑定了func内部的this指向(obj),但是不兼容ie6~8,兼容代码如下:

var obj = {

  a: 1,

  b: 2,

  getCount: function(c, d) {

    return this.a + this.b + c + d;

  }

};

 

Function.prototype.bind = Function.prototype.bind || function(context) {

  var that = this;

  return function() {

    // console.log(arguments); // console [3,4] if ie<6-8>

    return that.apply(context, arguments);

 

  }

}

window.a = window.b = 0;

var func = obj.getCount.bind(obj);

console.log(func(3, 4));  // 10

其实在我看来bind的核心是返回一个未执行的方法,如果直接使用apply或者call:

var ans = obj.getCount.apply(obj, [3, 4]);

console.log(ans); // 10

无法使用简写的func函数构造,所以用bind传递this指向,再返回一个未执行的方法,实现方式相当巧妙。

Javascript 相关文章推荐
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
Sep 14 Javascript
IE10中flexigrid无法显示数据的解决方法
Jul 26 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
js实现消息滚动效果
Jan 18 Javascript
浅谈Vue为什么不能检测数组变动
Oct 14 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
Angular8 实现table表格表头固定效果
Jan 03 Javascript
javascript实现简单留言板案例
Feb 09 Javascript
js前端图片加载异常兜底方案
Jun 21 Javascript
JS中获取函数调用链所有参数的方法
May 07 #Javascript
jQuery中animate动画第二次点击事件没反应
May 07 #Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 #Javascript
JS实现文字掉落效果的方法
May 06 #Javascript
DOM 高级编程
May 06 #Javascript
js获得当前系统日期时间的方法
May 06 #Javascript
js字符串操作方法实例分析
May 06 #Javascript
You might like
php中函数的形参与实参的问题说明
2010/09/01 PHP
教你如何使用php session
2013/10/28 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
linux下php上传文件注意事项
2016/06/11 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
Open and Print a Word Document
2007/06/15 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
数学备课组工作总结
2015/08/12 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
MYSQL常用函数介绍
2022/05/05 MySQL