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语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
随机推荐
- struts2之防止表单重复提交
struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- 修改css
.content{ height: 100%; } .con{ border: 1px solid #eeeeee; display: inline-block; width:86.8%; ##修改这 ...
- spoj-694-Distinct Substrings(后缀数组)
题意: 给定一个字符串,求不相同的子串的个数 分析: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同 的 前 缀 的 个 数 . 如 果 所 有 的 后 缀 按 照 suffix ...
- HDU-1565 方格取数(1)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Me ...
- Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
Given inorder and postorder traversal of a tree, construct the binary tree. 题目大意:给定一个二叉树的中序和后续序列,构建出 ...
- 《algorithm puzzles》——谜题
这篇文章开始正式<algorithm puzzles>一书中的解谜之旅了! 狼羊菜过河: 谜题:一个人在河边,带着一匹狼.一只羊.一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船空 ...
- linux环境下deb格式 转换成rpm格式
linux环境下deb格式 转换成rpm格式 使用alien工具转换deb格式到rpm格式 alien_8.87.tar.gz 下载alien_8.87.tar.gz [root@mysqlnode2 ...
- JEFF BANKS_百度百科
JEFF BANKS_百度百科 JEFF BANKS
- K - Candies(最短路+差分约束)
题目大意:给N个小屁孩分糖果,每个小屁孩都有一个期望,比如A最多比B多C个,再多了就不行了,会打架的,求N最多比1多几块糖 分析:就是求一个极小极大值...试试看 这里需要用到一个查分约束的东西 下面 ...
- G - Shuffle'm Up
题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...