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 相关文章推荐
用js实现的抽象CSS圆角效果!!
May 03 Javascript
JavaScript 获取任一float型小数点后两位的小数
Jun 30 Javascript
jQuery实现在列表的首行添加数据
May 19 Javascript
AngularJS  $modal弹出框实例代码
Aug 24 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
基于node.js依赖express解析post请求四种数据格式
Feb 13 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 Javascript
利用Javascript开发一个二维周视图日历
Dec 14 Javascript
vue实现简单图片上传
Jun 30 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连接Oracle数据库
2006/10/09 PHP
PHP中的日期及时间
2006/11/23 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
YII2框架使用控制台命令的方法分析
2020/03/18 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
pytorch实现查看当前学习率
2020/06/24 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
shell程序中如何注释
2012/02/17 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
酒店总经理助理职责
2014/02/12 职场文书
大学生个人自荐信
2014/02/24 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
小学音乐课教学反思
2016/02/18 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android