1.作用

函数的bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数。 //bind 相比于call apply   this 都等于 obj;   bind是产生一个新的函数 不执行,call apply 立即执行

Fn.bind(obj, arg1, arg2,...);

Fn.bind(obj)     //新的函数  function () { [native code] }  看不到

Fn.bind(obj) ();      //执行函数    类似:a=function(){};    执行 a();   一个道理

2.实例

var Fn = function(){
console.log(this);
}
var obj = {a:1}; Fn();
-> window //在浏览器环境 Fn.bind(obj)
-> function () { [native code] } //得到新的函数 Fn.bind(obj)();
-> Object {a: 1} //执行结果 console.log(this); this = obj

3.绑定参数

function add(x,y) { return x+y; }

var plus5 = add.bind(null, 5);   //把第一个参数给绑进去

plus5(10)     // 15      5+10 = 15

3.注意

bind每次运行都会产生新的函数,所以在用的时候要小心

element.addEventListener('click', Fn.bind(obj));        //在点击的时候,每次都会产生一个新的函数
element.removeEventListener('click', Fn.bind(obj)); //移除事件的时候就会无法取消绑定 //正确的方法
var listener = Fn.bind(obj);
element.addEventListener('click',listener );
element.removeEventListener('click', listener );

4.兼容

bind方法在ie8以下都不支持, 自定义bind如下

if(!('bind' in Function.prototype)){          //Function如果没有bind方法的话
Function.prototype.bind = function(){ //Function原型添加bind
var fn = this; //引用bind的函数
var context = arguments[0]; //obj 第一个参数
var args = Array.prototype.slice.call(arguments, 1); //去掉第一个参数 同等arguments.slice(1); 前面的写法 防止slice 被改过
return function(){ //返回一个新的fun
return fn.apply(context, args); // fn 上层的this 指的是引用bind的函数
}
}
}

5.延伸

Fn.bind(obj)   --> obj = 函数function

执行完后 新Fn的this  = 函数function

slice 是 Array 构造函数 的一个方法

[1, 2, 3].slice(0, 1);

->[1]

Array.prototype.slice.call([1,2,3], 0, 1);    //把Array.prototype.slice 方法  的this 指向 [1,2,3]  也就是 this =  [1,2,3];

->[1]

Function.prototype.call.bind(Array.prototype.slice)([1, 2, 3],0,1);

也可以这样表示:

var slice = Function.prototype.call.bind(Array.prototype.slice);

slice([1, 2, 3],0,1);

->[1]

得到同样的结果

原理:

.bind的作用是把引用函数的this指向 obj , 并生成一个新的函数。

这里的引用的函数是Function.prototype.call这个函数,通过bind  把this 指向 Array.prototype.slice 这个函数, 然后新生成一个函数。 如:我们通过定义 var slice  = 新函数 ;

这个新的函数 里的 this =  Array.prototype.slice;

我们执行slice([1, 2, 3],0,1) 的时候,事实上他是执行call([1, 2, 3],0,1),只是call里的this = Array.prototype.slice;

var obj={
x:10,
y:5
}; var fn = function(){
return this.x + this.y;
}; Function.prototype.call.bind(fn)(obj);
->15

个人看法:通过这种方式可以

1.扩展对象的方法(如果有构造函数的话,可以直接在构造函数上加入,直接了当,但是通过这种方式扩展的话可以保持原有构造函数的统一性;)

2.封装(可以通过这样的方式封装自己喜欢的公用的函数)

js bind的更多相关文章

  1. js bind的实现

    call,apply,bind都是用来挟持对象或者说更改this指向的,但是区别还是有的,call 传参是 fn.call(this,1,2,3) apply传参是 fn.apply(this,[1, ...

  2. JS bind()方法、JS原生实现bind()

    一.arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arg ...

  3. js bind绑定事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Js/Bind()的认识

    1.bind( eventType [, eventData], handler(eventObject))2.向绑定的对象上面提供一些事件方法的行为.其中三个参数的意义分别代表: 一.eventTy ...

  5. js bind 绑定this指向

    1.示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...

  6. js bind es5函数柯里化

    绑定函数 bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值.常见的错误就像上面的例子一样,将方法从对象中拿出来,然后调用,并且希望this指向原来的对象. 如果不做特 ...

  7. bind,call,apply区别

     js中bind.call.apply函数的用法 2015-02-27 21:16:39 标签:javascript js bind call apply 原创作品,允许转载,转载时请务必以超链接形式 ...

  8. Atitti.数据操作crud js sdk dataServiceV3设计说明

    Atitti.数据操作crud js sdk dataServiceV3设计说明 1. 增加数据1 1.1. 参数哦说明1 2. 查询数据1 2.1. 参数说明2 3. 更新数据2 3.1. 参数说明 ...

  9. javascript深入理解js闭包(转)

    javascript深入理解js闭包 转载  2010-07-03   作者:    我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

随机推荐

  1. LINUX HA:Pacemaker + Corosync初配成功

    参考很多文档: http://zhumeng8337797.blog.163.com/blog/static/100768914201218115650522/ 下一步,想想这个PC组和与HAPROX ...

  2. Code (组合数)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7184   Accepted: 3353 Description Trans ...

  3. AndroidStudio SVN检出

    版本管理是每个项目的必经之路,很多的ADT都会集成版本管理插件.AS也同样可以集成GITHUB和SVN插件.github对项目有一定的限制,而SVN就比较开放了,所以我们在用AS开发的时候一般用SVN ...

  4. bzoj 1560 [JSOI2009]火星藏宝图(DP)

    1560: [JSOI2009]火星藏宝图 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 647  Solved: 309[Submit][Status ...

  5. Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二

    准备工作:新建第一个JavaWeb项目 step3 给第一次配置tomcat的家伙们再说一遍如何配置tomcat 3.1 [Run]-[Edit Configurations] 3.2 [Defaul ...

  6. @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的

    出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙(子循),目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu @property 的本质是什么? @ ...

  7. Python里的map、reduce、filter、lambda、列表推导式

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  8. php微信支付接口开发程序(一)

    阅读对象 本文阅读对象:商户系统(在线购物平台.人工收银系统.自动化智能收银系统或其他)集成微信支付涉及的技术架构师,研发工程师,测试工程师,系统运维工程师. 支付模式 1. 刷卡支付 刷卡支付是用户 ...

  9. oracle存储过程含参数的插入数据

    create or replace procedure proczipcodebyzipinsert(   i_zipcode  in  zipcode.zip%type,   i_city in z ...

  10. [转] Are You Making a Big Mistake in This Volatile Market?

    Stock market volatility continues unabated. It may be too early to tell, but I’m marking the top of ...