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 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
Sep 06 Javascript
JavaScript数据结构与算法之链表
Jan 29 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
微信小程序本作用域下调用全局JS详解及实例
Feb 22 Javascript
JS按条件 serialize() 对应标签的使用方法
Jul 24 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 Javascript
JS设计模式之惰性模式(二)
Sep 29 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
layui前端时间戳转化实例
Nov 15 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在window iis的莫名问题的测试方法
2013/05/14 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python中的super用法详解
2015/05/28 Python
python实现黑客字幕雨效果
2018/06/21 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
十岁生日同学答谢词
2014/01/19 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
解除劳动合同协议书
2014/09/17 职场文书
美术教师个人总结
2015/02/06 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
经营场所使用证明
2015/06/19 职场文书
老人节主持词
2015/07/04 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
如何用python清洗文件中的数据
2021/06/18 Python