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 相关文章推荐
javascript 图片上一张下一张链接效果代码
Mar 12 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
Aug 29 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
Aug 02 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
Jul 15 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
异步安全加载javascript文件的方法
Jul 21 Javascript
jquery实现可关闭的倒计时广告特效代码
Sep 02 Javascript
JS 实现可停顿的垂直滚动实例代码
Nov 23 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
Jun 01 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 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
杏林同学录(七)
2006/10/09 PHP
PHP中对数据库操作的封装
2006/10/09 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
JS array 数组详解
2009/03/22 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
微信小程序模拟cookie的实现
2018/06/20 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
简单讲解Python中的闭包
2015/08/11 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
农民致富事迹材料
2014/01/23 职场文书
保护环境倡议书500字
2014/05/19 职场文书
教师自我剖析材料
2014/09/29 职场文书
办护照工作证明
2014/10/01 职场文书
汇报材料怎么写
2014/12/30 职场文书
十岁生日答谢词
2015/01/05 职场文书
高中美术教学反思
2016/02/17 职场文书