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 弹出窗体点击按钮返回选择数据的实现
Apr 01 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
jQuery实现遮罩层登录对话框
Dec 29 Javascript
浅谈angular.js跨域post解决方案
Aug 30 Javascript
angular中不同的组件间传值与通信的方法
Nov 04 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
Nuxt使用Vuex的方法示例
Sep 06 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 FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python求算数平方根和约数的方法汇总
2016/03/09 Python
python内存管理机制原理详解
2019/08/12 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
保健品市场营销方案
2014/03/31 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫