javascript之bind使用介绍


Posted in Javascript onOctober 09, 2011

前几天看到一个面试题,题目是这样的:
请你说说对javascript中apply,call,bind的理解?
首先apply和call是老生常谈的东西,但是对于bind,我愣了下,因为这个词是jquery中使用频率很高的一个方法,用来给DOM元素绑定事件用的。
为了搞清这个陌生又熟悉的bind,google一下,发现javascript1.8.5版本中原生实现了此方法,目前IE9+,ff4+,chrome7+支持此方法,opera和safari不支持(MDN上的说明)。
bind的作用和apply,call类似都是改变函数的execute context,也就是runtime时this关键字的指向。但是使用方法略有不同。一个函数进行bind后可稍后执行。
例子如下:

var person = { 
name: 'Andrew', 
job: 'web front end developer', 
gender: 'male', 
sayHello: function() { 
return 'Hi, I am ' + this.name + ', a ' + this.job; 
} 
} 
console.log(person.sayHello()); // Hi, I am Andrew, a web front end developer 
var anotherGuySayHello = person.sayHello.bind({ 
name:'Alex', 
job: 'back end C# developer' 
}); 
console.log(anotherGuySayHello()); // Hi, I am Alex, a back end C# developer

另外带有参数的例子:
function add(arg1, arg2, arg3, arg4) { 
return arg1 + ' ' + arg2 + ' ' + arg3 + ' ' + arg4; 
} 
var addMore = add.bind({}, 'a', 'b'); 
console.log(addMore('c', 'd')); // a b c d

如果你的浏览器暂时不支持此方法,但你又觉得这个很cool,想用,MDN上也给出参考实现, 这个实现很有意思,代码如下:
if(!Function.prototype.bind) { 
Function.prototype.bind = function(oThis) { 
if(typeof this !== 'function') { 
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
} 
var fSlice = Array.prototype.slice, 
aArgs = fSlice.call(arguments, 1), 
fToBind = this, 
fNOP = function() {}, 
fBound = function() { 
return fToBind.apply(this instanceof fNOP ? this : oThis || window, aArgs.concat(fSlice.call(arguments))); 
}; 
fNOP.prototype = this.prototype; 
fBound.prototype = new fNOP(); 
return fBound; 
}; 
}

最后几行代码,通过prototype chain的方式,其中fBound是调用bind函数的子类,为什么这么实现,可以仔细看 fBound = function(){ return ... }这一部分,其中this是运行时决定的,这里主要考虑到如果用new的方式来调用函数(构造函数方式)的情况。
下面的例子,就能很好的说明这点,为了方便说明,此例子直接来自MDN:
function Point(x,y) { 
this.x = x; 
this.y = y; 
} 
Point.prototype.toString = function() { 
return this.x + ',' + this.y; 
}; 
var p = new Point(1, 2); 
p.toString(); // 1,2 
var emptyObj = {}; 
var YAxisPoint = Point.bind(emptyObj, 0); 
var axisPoint = new YAxisPoint(5); 
axisPoint.toString(); // 0, 5 
axisPoint instanceof Point; // true 
axisPoint instanceof YAxisPoint; // true

最后给出文章链接,方便您进一步了解
MDN: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

MSDN: http://msdn.microsoft.com/en-us/library/ff841995%28v=vs.94%29.aspx
Javascript 相关文章推荐
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
基于jquery的返回顶部效果(兼容IE6)
Jan 17 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
Oct 21 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
vue权限问题的完美解决方案
May 08 Javascript
Vue组件之高德地图地址选择功能的实例代码
Jun 21 Javascript
关于JS解构的5种有趣用法
Sep 05 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
微信小程序文章列表功能完整实例
Jun 03 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 #Javascript
使用jQuery操作Cookies的实现代码
Oct 09 #Javascript
jQuery实现切换页面布局使用介绍
Oct 09 #Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
Oct 08 #Javascript
关于jQuery的inArray 方法介绍
Oct 08 #Javascript
imgAreaSelect 中文文档帮助说明
Oct 08 #Javascript
JavaScript判断一个URL链接是否有效的实现方法
Oct 08 #Javascript
You might like
论坛头像随机变换代码
2006/10/09 PHP
一个简单的域名注册情况查询程序
2006/10/09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
javascript显示选择目录对话框的代码
2008/11/10 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
详解Django中的过滤器
2015/07/16 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Python实现Restful API的例子
2019/08/31 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
员工年终演讲稿
2014/01/03 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
调解协议书范本
2016/03/21 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python