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 相关文章推荐
js计算页面刷新的次数
Jul 20 Javascript
javascript Keycode对照表
Oct 24 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
用innerhtml提高页面打开速度的方法
Aug 02 Javascript
JavaScript中this的四个绑定规则总结
Sep 26 Javascript
Bootstrap页面标题Page Header的实现方法
Mar 22 Javascript
简单谈谈axios中的get,post方法
Jun 25 Javascript
关于vue.js发布后路径引用的问题解决
Aug 15 Javascript
jQuery实现全选、反选和不选功能
Aug 16 jQuery
Vue列表渲染的示例代码
Nov 01 Javascript
Angular8路由守卫原理和使用方法
Aug 29 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 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
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
JavaScript的Cookies
2008/01/16 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
Python logging模块学习笔记
2014/05/24 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python入门_条件控制(详解)
2017/05/16 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python中创建二维数组
2018/10/17 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
python实现根据文件格式分类
2019/10/31 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
Django视图、传参和forms验证操作
2020/07/15 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
小学国旗下的演讲稿
2014/08/28 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
百年孤独读书笔记
2015/06/29 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
导游词之青岛崂山
2019/12/27 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python