js bind
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的更多相关文章
- js bind的实现
		call,apply,bind都是用来挟持对象或者说更改this指向的,但是区别还是有的,call 传参是 fn.call(this,1,2,3) apply传参是 fn.apply(this,[1, ... 
- JS bind()方法、JS原生实现bind()
		一.arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arg ... 
- js bind绑定事件
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- Js/Bind()的认识
		1.bind( eventType [, eventData], handler(eventObject))2.向绑定的对象上面提供一些事件方法的行为.其中三个参数的意义分别代表: 一.eventTy ... 
- js bind 绑定this指向
		1.示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ... 
- js bind  es5函数柯里化
		绑定函数 bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值.常见的错误就像上面的例子一样,将方法从对象中拿出来,然后调用,并且希望this指向原来的对象. 如果不做特 ... 
- bind,call,apply区别
		js中bind.call.apply函数的用法 2015-02-27 21:16:39 标签:javascript js bind call apply 原创作品,允许转载,转载时请务必以超链接形式 ... 
- Atitti.数据操作crud js sdk dataServiceV3设计说明
		Atitti.数据操作crud js sdk dataServiceV3设计说明 1. 增加数据1 1.1. 参数哦说明1 2. 查询数据1 2.1. 参数说明2 3. 更新数据2 3.1. 参数说明 ... 
- javascript深入理解js闭包(转)
		javascript深入理解js闭包 转载 2010-07-03 作者: 我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ... 
随机推荐
- 【HDOJ】2487 Ugly Windows
			暴力解. #include <cstdio> #include <cstring> #define MAXN 105 char map[MAXN][MAXN]; ]; int ... 
- 主席树:POJ2104 K-th Number (主席树模板题)
			K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44952 Accepted: 14951 Ca ... 
- 【字符串】【最小表示法】Vijos P1683 有根树的同构问题
			题目链接: https://vijos.org/p/1683 题目大意: 给M棵树,每棵N个点,N-1条边,树边有向,问哪些树同构. 题目思路: [字符串][最小表示法] 用()表示一个节点,那么三个 ... 
- Nodejs in Visual Studio Code 09.企业网与CNPM
			1.开始 CNPM : https://npm.taobao.org/ 2.企业网HTTP代理上网 平时办公在一个大企业网(10.*.*.*)中,使用HTTP代理上网,发现npm命令无法执行. 解决方 ... 
- [Audio processing] wav音频文件合并
			合并多个文件,需要包含1.文件读取和写入功能,2.数组合并 package com.audioprocessingbox.myfunc; import java.io.File; import jav ... 
- [Locked] Longest Substring with At Most Two Distinct Characters
			Longest Substring with At Most Two Distinct Characters Given a string, find the length of the longes ... 
- 约瑟夫环问题-Java数组解决
			约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. clas ... 
- Wow! Such Doge! - HDU 4847 (水题)
			题目大意:题目描述了一大堆.....然而并没什么用,其实就是让求给的所有字符串里面有多少个"doge",不区分大小写. 代码如下: ====================== ... 
- Palindrome - POJ 3974 (最长回文子串,Manacher模板)
			题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了. 代码如下: ================================================= ... 
- [Javascript] Logging Pretty-Printing Tabular Data to the Console
			Learn how to use console.table to render arrays and objects in a tabular format for easy scanning ov ... 
