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非法字符过滤代码(骂人的话等等)
May 26 Javascript
jQuery参数列表集合
Apr 06 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
Jan 15 Javascript
解析javascript 实用函数的使用详解
May 10 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
Bootstrap登陆注册页面开发教程
Jul 12 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
解决vue+webpack打包路径的问题
Mar 06 Javascript
vue实现城市列表选择功能
Jul 16 Javascript
vue 获取url里参数的两种方法小结
Nov 12 Javascript
vue实现登录功能
Dec 31 Vue.js
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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
PHP PDO函数库详解
2010/04/27 PHP
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
Node.js笔记之process模块解读
2018/05/31 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
基于python3的socket聊天编程
2020/02/17 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
记帐员岗位责任制
2014/02/08 职场文书
精彩的广告词
2014/03/19 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
Go语言设计模式之结构型模式
2021/06/22 Golang