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 相关文章推荐
firebug的一个有趣现象介绍
Nov 30 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jQuery判断指定id的对象是否存在的方法
May 22 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
Jquery获取radio选中的值
May 05 jQuery
JavaScript轮播停留效果的实现思路
May 24 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
在Angular项目使用socket.io实现通信的方法
Jan 05 Javascript
Typescript类型系统FLOW静态检查基本规范
May 25 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
php 定界符格式引起的错误
2011/05/24 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
一份python入门应该看的学习资料
2018/04/11 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Django框架安装方法图文详解
2019/11/04 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
Android面试题及答案
2015/09/04 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
函授自我鉴定
2013/11/06 职场文书
银行财务部实习生的自我鉴定
2013/11/27 职场文书
捐赠仪式主持词
2014/03/19 职场文书
介绍信格式
2015/01/30 职场文书