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语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
随机推荐
- c#,if 分支语句,条件运算符
//输入整数a和b, //若a²+b²大于100,则输出a²+b²百位以上数字, //否则输出两数之和 /*Console.Write("请输入整数a:"); int a = in ...
- pgAdminIII使用图解
原文地址:http://www.2cto.com/database/201312/267218.html pgAdmin III简介 要打开一个到服务的连接,在树中选择所需的服务,并双击它,或使用“工 ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- hdu-1272 并查集
Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...
- 字符编码 ASCII,Unicode 和 UTF-8 概念扫盲
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思 ...
- flumeng-kafka-plugin
github 参考地址:https://github.com/beyondj2ee/flumeng-kafka-plugin/tree/master/flumeng-kafka-plugin /* * ...
- python环境配置selenium与IE、Chrome、Firefox、PhantomJS
安装.升级selenium pip install -U selenium 下载对应平台最新版的browser driver chrome: http://chromedriver.storage.g ...
- 移动端解决fixed和input获取焦点软键盘弹出影响定位的问题
场景描述, 当document的高度不够window的高度时候,如在ip6中文档的高度比窗体的高度小,到底设计在最下方的区域没有在窗体最下方,就留有空白地方如下图的灰色部分 1. 解决初始化文档高度, ...
- poj 3478 The Stable Marriage Problem 稳定婚姻问题
题目给出n个男的和n个女的各自喜欢对方的程度,让你输出一个最佳搭配,使得他们全部人的婚姻都是稳定的. 所谓不稳婚姻是说.比方说有两对夫妇M1,F1和M2,F2,M1的老婆是F1,但他更爱F2;而F2的 ...
- Android内存等信息
1. Linux中proc目录下文件详解 http://wenku.baidu.com/view/2ce89f00a6c30c2259019ef1.html 2. Android系统/proc目录详解 ...