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 相关文章推荐
jQeury淡入淡出需要注意的问题
Sep 08 Javascript
Javascript面向对象编程
Mar 18 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
整理Javascript基础入门学习笔记
Nov 29 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
js中toString()和String()区别详解
Mar 23 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 Javascript
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php 引用(&)详解
2009/11/20 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
简单上手Python中装饰器的使用
2015/07/12 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Python3监控疫情的完整代码
2020/02/20 Python
使用python实现名片管理系统
2020/06/18 Python
python 自动识别并连接串口的实现
2021/01/19 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
开业庆典答谢词
2014/01/18 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
导游词400字
2015/02/13 职场文书
二审代理词范文
2015/05/25 职场文书
律政俏佳人观后感
2015/06/09 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL