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 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
Apr 02 Javascript
javascript实现的DES加密示例
Oct 30 Javascript
一个JavaScript处理textarea中的字符成每一行实例
Sep 22 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
解决js图片加载时出现404的问题
Nov 30 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
一百行JS代码实现一个校验工具
Apr 30 Javascript
Vue filter 过滤器、以及在table中的使用介绍
Sep 07 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实现ODBC数据分页显示一例
2006/10/09 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python对excel文档去重及求和的实例
2018/04/18 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
python实现连连看游戏
2020/02/14 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
小学教师师德感言
2014/02/10 职场文书
进步之星获奖感言
2014/02/22 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
公司运动会策划方案
2014/05/25 职场文书
电教室标语
2014/06/20 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
教师节领导致辞
2015/07/29 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
Linux安装Docker详细教程
2022/07/07 Servers