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 纠正 cleanWhitespace函数
Mar 11 Javascript
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
javascript实现数字+字母验证码的简单实例
Feb 10 Javascript
JavaScript中的eval()函数使用介绍
Dec 31 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
bootstrap的工具提示实例代码
May 17 Javascript
vue一步步实现alert功能
Jul 05 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 Javascript
Vue绑定用户接口实现代码示例
Nov 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
DOM XPATH获取img src值的query
2013/09/23 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
js 设置选中行的样式的实现代码
2010/05/24 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
简单谈谈python的反射机制
2016/06/28 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
监理员的岗位职责
2013/11/13 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
工地质量标语
2014/06/12 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP