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 相关文章推荐
在线游戏大家来找茬II
Sep 30 Javascript
javascript中的作用域scope介绍
Dec 28 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
JavaScript中常用的运算符小结
Jan 18 Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 Javascript
VC调用javascript的几种方法(推荐)
Aug 09 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
详解Angular5 服务端渲染实战
Jan 04 Javascript
vue弹窗插件实战代码
Sep 08 Javascript
从0搭建vue-cli4脚手架
Jun 17 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
Dec 09 Javascript
8个非常实用的Vue自定义指令
Dec 15 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
php循环输出数据库内容的代码
2008/05/24 PHP
php 小乘法表实现代码
2009/07/16 PHP
PHP小教程之实现链表
2014/06/09 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP pear安装配置教程
2016/05/14 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
学习ExtJS Window常用方法
2009/10/07 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
js友好的时间返回函数
2016/08/24 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python实现视频压缩功能
2020/12/18 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
银行毕业实习自我鉴定
2013/09/19 职场文书
4s客服专员岗位职责
2013/12/01 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
粗加工管理制度
2014/02/04 职场文书
顶碗少年教学反思
2014/02/21 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
运动会5000米加油稿
2015/07/21 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
vue中data里面的数据相互使用方式
2022/06/05 Vue.js