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 相关文章推荐
syntaxhighlighter 使用方法
Jul 02 Javascript
jQuery 相关控件的事件操作分解
Aug 03 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
jQuery中delegate与on的用法与区别示例介绍
Dec 20 Javascript
javascript实现json页面分页实例代码
Feb 20 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
Javascript复制实例详解
Jan 28 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
Jun 23 Javascript
谈谈JavaScript中的几种借用方法
Aug 09 Javascript
js时间比较 js计算时间差的简单实现方法
Aug 26 Javascript
jstl中判断list中是否包含某个值的简单方法
Oct 14 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 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 xml文件操作代码(一)
2009/03/20 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
javascript中length属性的探索
2011/07/31 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
介绍Python的@property装饰器的用法
2015/04/28 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python 字典套字典或列表的示例
2019/12/16 Python
python绘制彩虹图
2019/12/16 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
单位工作证明
2014/10/07 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
结婚十年感言
2015/07/31 职场文书
python实现三次密码验证的示例
2021/04/29 Python