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 模拟点击广告
Jan 02 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
javascript来定义类的规范小结
Nov 19 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
基于zepto的移动端轻量级日期插件--date_picker
Mar 04 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
快速将Vue项目升级到webpack3的方法步骤
Sep 14 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
解决vant的Toast组件时提示not defined的问题
Nov 11 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中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
PHP培训要多少钱
2017/06/06 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
车贷收入证明范本
2014/01/09 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
思品教学工作总结
2015/08/10 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python