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的一个简单的脚本验证插件
Apr 05 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
javascript批量修改文件编码格式的方法
Jan 27 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
Dec 02 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
Javascript中prototype的使用详解
Jun 18 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
通过命令行生成vue项目框架的方法
Jul 12 Javascript
node中koa中间件机制详解
Aug 22 Javascript
写给小白看的JavaScript异步
Nov 29 Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 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获取mysql版本的几种方法小结
2008/03/25 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
python三引号输出方法
2019/02/27 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
小学红领巾中秋节广播稿
2014/01/13 职场文书
基层干部十八大感言
2014/01/19 职场文书
求职信标题怎么写
2014/05/26 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
研究生导师推荐信
2015/03/25 职场文书
开展警示教育活动总结
2015/05/09 职场文书
三国演义读书笔记
2015/06/25 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书