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捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
JavaScript实现的in_array函数
Aug 27 Javascript
node.js中的path.join方法使用说明
Dec 08 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
浅谈类似于(function(){}).call()的js语句
Mar 30 Javascript
基于Jquery实现表单验证
Jul 20 Javascript
jquery判断复选框是否被选中的方法
Oct 16 Javascript
详解JavaScript UTC时间转换方法
Jan 07 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
jquery实现弹窗功能(窗口居中显示)
Feb 27 Javascript
浅谈vue限制文本框输入数字的正确姿势
Sep 02 Javascript
JS实现横向轮播图(中级版)
Jan 18 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 selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
php生成短域名函数
2015/03/23 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
JS控件的生命周期介绍
2012/10/22 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中apply函数的用法实例教程
2014/07/31 Python
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python实现partial改变方法默认参数
2014/08/18 Python
python动态网页批量爬取
2016/02/14 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python sorted对list和dict排序
2020/06/09 Python
Python中的With语句的使用及原理
2020/07/29 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
建筑班组长岗位职责
2014/01/02 职场文书
酒店节能减排方案
2014/05/26 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
财务会计专业求职信
2014/06/09 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
单位租车协议书
2015/01/29 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书