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 相关文章推荐
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
Jquery动态添加及删除页面节点元素示例代码
Jun 16 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
jQuery实现边框动态效果的实例代码
Sep 23 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
BootStrap 标题设置跨行无效的解决方法
Oct 25 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
Oct 12 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
Nov 19 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 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
中国第一家无线电行
2021/03/01 无线电
PHP 面向对象详解
2012/09/13 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
JavaScript 空位补零实现代码
2010/02/26 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python3中property使用方法详解
2019/04/23 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
责任担保书范文
2014/05/21 职场文书
十八大演讲稿
2014/05/22 职场文书
大学生就业求职信
2014/06/12 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
党小组意见范文
2015/06/08 职场文书