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 写类方式之一
Jul 05 Javascript
JavaScript 利用Cookie记录用户登录信息
Dec 08 Javascript
理解Javascript_02_理解undefined和null
Oct 11 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
JS执行删除前的判断代码
Feb 18 Javascript
jQuery中closest()函数用法实例
Jan 07 Javascript
jquery实现图片随机排列的方法
May 04 Javascript
基于BootStrap实现局部刷新分页实例代码
Aug 08 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
原生js检测页面加载完毕的实例
Sep 11 Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 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
session在PHP大型web应用中的使用
2011/06/25 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
js分页代码分享
2014/04/28 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
10个Python小技巧你值得拥有
2018/09/29 Python
详解python的argpare和click模块小结
2019/03/31 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
经济学博士求职自荐信范文
2013/11/23 职场文书
服务行业个人求职的自我评价
2013/12/12 职场文书
禁毒宣传标语
2014/06/19 职场文书
企业安全生产目标责任书
2014/07/23 职场文书