simplify the life ECMAScript 5(ES5)中bind方法简介
一直以来对和this有关的东西模糊不清,譬如call、apply等等。这次看到一个和bind有关的笔试题,故记此文以备忘。
bind和call以及apply一样,都是可以改变上下文的this指向的。不同的是,call和apply一样,直接引用在方法上,而bind绑定this后返回一个方法,但内部核心还是apply。
直接看例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
var obj = { a: 1, b: 2, getCount: function(c, d) { return this.a + this.b + c + d; }};window.a = window.b = 0;console.log(obj.getCount(3, 4)); // 10var func = obj.getCount;console.log(func(3, 4)); // 7 |
为何会这样?因为func在上下文中的this是window!bind的存在正是为了改变this指向获取想要的值:
|
1
2
3
4
5
6
7
8
9
10
11
|
var obj = { a: 1, b: 2, getCount: function(c, d) { return this.a + this.b + c + d; }};window.a = window.b = 0;var func = obj.getCount.bind(obj);console.log(func(3, 4)); // 10 |
bind是function的一个函数扩展方法,bind以后代码重新绑定了func内部的this指向(obj),但是不兼容ie6~8,兼容代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var obj = { a: 1, b: 2, getCount: function(c, d) { return this.a + this.b + c + d; }};Function.prototype.bind = Function.prototype.bind || function(context) { var that = this; return function() { // console.log(arguments); // console [3,4] if ie<6-8> return that.apply(context, arguments); }}window.a = window.b = 0;var func = obj.getCount.bind(obj);console.log(func(3, 4)); // 10 |
其实在我看来bind的核心是返回一个未执行的方法,如果直接使用apply或者call:
|
1
2
|
var ans = obj.getCount.apply(obj, [3, 4]);console.log(ans); // 10 |
无法使用简写的func函数构造,所以用bind传递this指向,再返回一个未执行的方法,实现方式相当巧妙。
2015-6-10补充:
昨天看到一个bind在代码中的装逼实现。如何用setTimeout连续打印0~9?
以前试过的朋友肯定知道,直接打印是不行的,会打印出一样的数字,这时候就要用闭包了,闭包的话有两种方式,简单实现一种如下:

for(var i = 0; i < 10; i++) {
~function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}(i);
}

但是居然用bind也能实现:
for(var i = 0; i < 10; i++) {
setTimeout(console.log.bind(console, i), i * 1000);
}
这样为何也能实现,我也是百思不得其解,只能说不明觉厉。
bind是和apply、call一样,是Function的扩展方法,所以应用场景是func.bind(),而传的参数形式和call一样,第一个参数是this指向,之后的参数是func的实参,fun.bind(thisArg[, arg1[, arg2[, ...]]])。
simplify the life ECMAScript 5(ES5)中bind方法简介的更多相关文章
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- js学习进阶中-bind()方法
有次面试遇到的,也是没说清楚具体的作用,感觉自己现在还是没有深刻的理解! bind():绑定事件类型和处理函数到DOM element(父元素上) live():绑定事件到根节点上,(document ...
- Javascript中bind()方法的使用与实现
对于bind,我愣了下,这个方法常用在jquery中,用于为被选元素添加一个或多个事件处理程序. 查了下手册,发现bind的作用和apply,call类似都是改变函数的execute context, ...
- 理解js中bind方法的使用
提到bind方法,估计大家还会想到call方法.apply方法:它们都是Function对象内建的方法,它们的第一个参数都是用来更改调用方法中this的指向.需要注意的是bind 是返回新的函数,以便 ...
- ES6中。类与继承的方法,以及与ES5中的方法的对比
// 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...
- es3的语法来模拟es5的bind方法
// 简单版 Function.prototype.bind = function(context) { var self = this; return function() { self.apply ...
- 不用call和apply方法模拟实现ES5的bind方法
本文首发我的个人博客:前端小密圈,评论交流送1024邀请码,嘿嘿嘿
- jq中 load()方法 简介
load()方法会在元素的onload事件中绑定一个处理函数.如果处理函数绑定给window对象,则会在所有内容(包括窗口,框架,对象和图像等)加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内 ...
随机推荐
- win7 安装vs2010报错 Error code -939523550 for this component is not recognizedHi
When i try to install VS2010, Its not installing. I'm getting an error. It just try to install the ...
- Mac_配置adb环境变量
1.打开终端Terminal. 2.进入HOME目录:命令行输入 echo(这之间有一个空格) $HOME 3.创建.bash_profile文件:命令行输入 touch(这之间有一个空格).bash ...
- SQL获取选中时间的交集
如上图:t1,t2代表要选择的时间段,t3,t4代表系统时间. 那么如果要获取选中时间段所有的交集为: 条件1 and ((t3>t1 and t1>t2) or (t3<t2 an ...
- Java数据库缓存思路
为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作,50个用户并发数据库就歇菜,这样最多能支撑的pv也就50 ...
- html5新特性--音频视频,拖放
1.音频 <audio controls> <source src="aaa.ogg" type="audio/ogg"> <so ...
- [转载]iOS开发:获取设备信息
开发iOS平台的应用的时候,可以获取iOS设备的设备信息,包括设备的名称,设备的机型,设备的iOS版本等等.设备信息主要来自 UIDevice 类. UIDevice *currentDevice = ...
- C++读取一串不知个数的数字
#include <iostream> using namespace std; int main(){ ]; ; while(cin>>shuzu[i]){ i++; } ; ...
- pygame实现的黑白块游戏
运行时需要pygame库. 下载地址:http://files.cnblogs.com/files/zzrom/white.zip 程序截图:
- jsp笔记,包括编译指令和动作指令,九大对象等
jsp基础知识 不包括HTTP协议,只有jsp的基础知识,包括表达式,代码片段,jsp九大对象等. 编译指令是在jsp被转换成selvet时,使用的. 而动作指令,是在每次客户端请求时动态执行.
- Java系列--第一篇 Maven+Spring+Spring MVC+mybatis 示例
基于Maven的Spring+SpringMVC+Mybatis的一个小项目的搭建,由于使用Maven3.1.0管理,所以Spring等都将使用的是时下(2013/9/8)最新的版本.即从http:/ ...