javascript之bind使用介绍

 更新时间:2011年10月09日 00:12:05   作者:  
首先apply和call是老生常谈的东西,但是对于bind,我愣了下,因为这个词是jquery中使用频率很高的一个方法,用来给DOM元素绑定事件用的
前几天看到一个面试题,题目是这样的:
请你说说对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之典型高阶函数应用介绍二

    在前一篇文章javascript之典型高阶函数中主要实现了几个典型的functional函数,文章最后也提出了疑问,为啥那样的实现与F#之类的函数式语言“不太一样”呢?今天来试试更“函数式”的实现
    2013-01-01
  • js中各种时间格式的转换方法举例

    js中各种时间格式的转换方法举例

    近几天在做百度地图时,需要转换时间格式并做显示,下面这篇文章主要给大家介绍了关于js中各种时间格式的转换方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 如何使用Bootstrap 按钮实例详解

    如何使用Bootstrap 按钮实例详解

    本章将通过实例讲解如何使用 Bootstrap 按钮。任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观。但是 Bootstrap 提供了一些选项来定义按钮的样式。具体通过本文实例详解
    2017-03-03
  • JS拖拽排序插件Sortable.js用法实例分析

    JS拖拽排序插件Sortable.js用法实例分析

    这篇文章主要介绍了JS拖拽排序插件Sortable.js用法,结合实例形式分析了拖拽排序插件Sortable.js功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • sso跨域写cookie的一段js脚本(推荐)

    sso跨域写cookie的一段js脚本(推荐)

    下面小编就为大家带来一篇sso跨域写cookie的一段js脚本(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaScript引用类型Date常见用法实例分析

    JavaScript引用类型Date常见用法实例分析

    这篇文章主要介绍了JavaScript引用类型Date常见用法,结合实例形式分析了引用类型Date基本创建、参数使用及相关注意事项,需要的朋友可以参考下
    2018-08-08
  • js实现购物车加减以及价格计算功能

    js实现购物车加减以及价格计算功能

    这篇文章主要为大家详细介绍了js实现购物车加减以及价格计算功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 快速获取/设置iframe内对象元素的几种js实现方法

    快速获取/设置iframe内对象元素的几种js实现方法

    下面小编就为大家带来一篇快速获取/设置iframe内对象元素的几种js实现方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 解读input标签的value属性及name属性

    解读input标签的value属性及name属性

    这篇文章主要介绍了解读input标签的value属性,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Webpack打包详细流程及代码

    Webpack打包详细流程及代码

    这篇文章主要给大家介绍了关于Webpack打包详细流程及代码的相关资料,Webpack是一款非常流行的打包工具,它的主要作用是将项目中的各个模块打包成静态资源,以便于在浏览器中加载和运行,需要的朋友可以参考下
    2024-01-01

最新评论