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 相关文章推荐
js实现按钮颜色渐变动画效果
Aug 20 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
微信小程序 弹框和模态框实现代码
Mar 10 Javascript
关于Promise 异步编程的实例讲解
Sep 01 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
使用Vue.observable()进行状态管理的实例代码详解
May 26 Javascript
Vue项目打包压缩的实现(让页面更快响应)
Mar 10 Javascript
node运行js获得输出的三种方式示例详解
Jul 02 Javascript
vue中路由跳转不计入history的操作
Sep 21 Javascript
vue实力踩坑之push当前页无效
Apr 10 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
一个简单的PHP入门源程序
2006/10/09 PHP
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
js禁止表单重复提交
2017/08/29 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
Python进阶篇之字典操作总结
2016/11/16 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python实现简单登陆系统
2018/10/18 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
什么是Remote Module
2016/06/10 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
农林环境专业求职信
2014/03/13 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
2014年库房工作总结
2014/11/26 职场文书
2015年团支书工作总结
2015/04/03 职场文书
员工表扬信怎么写
2015/05/05 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL