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 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
理解Javascript_12_执行模型浅析
Oct 18 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
Mar 14 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
简述Angular 5 快速入门
Nov 04 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
Nov 18 Javascript
javascript读取本地文件和目录方法详解
Aug 06 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
Sep 11 Javascript
js面向对象方式实现拖拽效果
Mar 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
javascript window对象属性整理
2009/10/24 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
python使用socket远程连接错误处理方法
2015/04/29 Python
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
承诺函格式模板
2015/01/21 职场文书
煤矿安全保证书
2015/02/27 职场文书
2016年元旦寄语
2015/08/17 职场文书
《社戏》教学反思
2016/02/22 职场文书
Vue如何清空对象
2022/03/03 Vue.js