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语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
随机推荐
- TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...
- Buffer Sort
BUFFER (SORT) Description Performs a memory sort on a row source CREATE TABLE t1 (c01 NUMBER); CREAT ...
- Strange Way to Express Integers (一般模线性方程组)
Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 8476 Accepted: 2554 Description Elin ...
- LNMP搭建(CentOS 6.3+Nginx 1.2.0+PHP 5.3.15(fpm)+ MySQL 5.5.35)
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 ...
- (转载)PHP_Memcache函数详解
(转载)http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/04/19/2021605.html memcache函数所有的方法列表如下: M ...
- hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...
- Ubuntu频率较高的操作
一.切换超级用户 由于 Ubuntu 是基于 Debian 的 linux 操作系统,在默认的情况下,是没有超级用户(superuser, root)的,但有些系统操作必须有超级用户的权限才能进行,如 ...
- 解决SQL Server管理器无法连接远程数据库Error: 1326错误
解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例 ...
- Android少量数据保存之SharedPreferences接口实例
SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...
- Linux下报 java.net.SocketException权限不够 异常解决
转载自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html 今天在Linux下用Jetty ...