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编程起步(第二课)
Jan 10 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
javascript作用域和闭包使用详解
Apr 25 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
Layui事件监听的实现(表单和数据表格)
Oct 17 Javascript
简述Vue中容易被忽视的知识点
Dec 09 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 Http_Template_IT类库进行模板替换
2009/03/19 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
php实现可运算的验证码
2015/11/10 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
python查看微信好友是否删除自己
2016/12/19 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Django实现分页功能
2018/07/02 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
python Xpath语法的使用
2020/11/26 Python
python爬虫工具例举说明
2020/11/30 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
英文演讲稿
2014/05/15 职场文书
百日安全生产活动总结
2014/07/05 职场文书
毕业证明书
2015/06/19 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
《观察物体》教学反思
2016/02/17 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
MySQL 服务和数据库管理
2021/11/11 MySQL
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript