bind、call和apply对比和使用
最开始关于call、apply、bind函数的使用时,总是很模糊,不知道用哪一个,this指向问题等,看了一些别人的总结后有了一定的理解,所以特地记录一下:
要搞清楚call、apply、bind我们从三个问题入手,解决了三个问题这三个方法也差不多了
1:为啥我们生产过程中会用到call、apply、bind及它们到底是干嘛的
2:它们具体怎么使用
3:三个有没有什么区别
接下来我们说一个场景:有一天一个山大王(oldMan)带着小罗罗们在巡山,手里是一把大刀,逛着逛着突然停下了脚步,为啥?因为他们看见一个人(newMan)正在拉弓准备射击远处的一只肥壮的山鸡,一瞬间newMan射中了那只山鸡兴高采烈的准备 烤山鸡,山大王羡慕极了,因为自己也发现了一只山鸡可惜没有弓箭。可是自己手里只有一把大刀根本抓不止山鸡,这时候小罗罗有的说直接把弓箭抢过来然后射击山鸡,有的说暴力不好最好是先借一下弓箭,射击山鸡后再还给他就是。
山大王做法1:直接抢过来用,不还了----bind。

山大王做法2:先借用一下,用完就还----call

山大王做法2:先借用一下,用完就还----apply(就是传参数方式是数组而已和call没啥区别)

最后我们来说一下一开始提到的三个问题:
先把三个方式放在一起:
newMan.getChicken.bind(oldMan)(3);//射击的山鸡为:old chicken 射击了3次
newMan.getChicken.call(oldMan,3);//射击的山鸡为:old chicken 射击了3次
newMan.getChicken.apply(oldMan,[3]);//射击的山鸡为:old chicken 射击了3次
1为啥要用bind、call、apply。就是自己解决不了,但是别人能解决,把别人的方法或抢过来(bind绑定),或借过来使用一下下(call、apply,能用但是自己对象里任然没有这个方法),这也解决了 this指向问题:
bind: 强行把当前使用该方法的对象指向了自己,讲白了就是把方法强行放进自己的作用域里了,bind只干了这些事情,但是像用方法,得再加()调用
call: call就是直接执行一个自己指定this指向的函数,参数是一个一个传递。感觉像是人家调用自己的方法时趁机偷到自己的怀抱里
apply: 同上,就是参数是数组形式而已
2 使用方法上面说了
3 区别在1中说了
如果有理解错误的地方希望大家批评指正,谢谢。
结语:点点滴滴,慢慢积累,平生多阅历,胸中有丘壑。
bind、call和apply对比和使用的更多相关文章
- bind(),call(), apply()方法的区别是什么?
bind(),call(), apply()方法的区别是什么? 共同点:改变this指向,任何调用都不在起作用 bind() 改变this的指向,不会调用函数,返回一个新的函数 var o ={a:' ...
- JavaScript中的bind,call和apply函数的用法和区别
一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...
- Function.apply.bind()与Function.apply.bind()
1.Function.apply.bind(…) 我在学习promise部分的时候遇到了这样的代码: Promise.resolve([10,20]).then(Function.apply.bind ...
- Apply,Call,bind对比
apply.call call和apply都是为了改变上下文背景存在的,即改变函数内部指向 javascript一大特点是函数存在定义时的上下文,运行时的上下文和上下文可改变的概念 apply.cal ...
- 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别
JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...
- 深入浅出 妙用Javascript中apply、call、bind
apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...
- 改变this指针的apply,call,bind的区别
apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...
- (转)深入浅出 妙用Javascript中apply、call、bind
原文连接 深入浅出 妙用Javascript中apply.call.bind 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且 ...
随机推荐
- ArcCore重构-Makefile模块化
基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题 2. 编译系统中代码文件是否编译及目标文件集中定义在boards/board_common.mk,而 ...
- vue项目 构建 打包 发布 三部曲
一.vue项目的创建 1.首先第一肯定是要有Node.js及npm这个不多说了2.安装脚手架 此时可以直接浏览-但是现在肯定有很多小白想将他发布到gitHub上并可以浏览,使用vue全家桶制作自己的博 ...
- ThreadPoolExecutor 学习笔记
线程池的奥义 在开发程序的过程中,很多时候我们会遇到遇到批量执行任务的场景,当各个具体任务之间互相独立并不依赖其他任务的时候,我们会考虑使用并发的方式,将各个任务分散到不同的线程中进行执行来提高任务的 ...
- 读《图解HTTP》有感-(返回结果的HTTP状态码)
写在前面 HTTP状态码是由服务端产生,用于告诉客户端,服务端处理结果的编码 正文 1.状态码的作用是什么?具有什么特征? 状态码的作用是当客户端向服务器发送请求时,描述服务器的响应结果(如:服务器正 ...
- java线程间通信之通过管道进行通信
管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西. jdk中提供了四个类来使线程间可以通信: 1)PipedInputStream和PipedOu ...
- SSM-SpringMVC-25:SpringMVC异常顶级之自定义异常解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上篇博客相信大家也看到了,自定义异常,用了SimpleMappingExceptionResolver这个解析 ...
- Undoing Merges
I would like to start writing more here about general Git tips, tricks and upcoming features. There ...
- jdk下载以及配置
http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
- SQL查询中用到的函数
数据库表 students id name sex age address 101 张汉 男 14 杭州 102 欧阳钦 男 13 杭州 103 吴昊 男 14 北京 104 钱进进 男 ...
- 关于for循环里面异步操作的问题
首先来看一个比较简单的问题,我们想实现的就是每隔1s输出0-4的值,就是这么简单,看下错误写法: function test() { for (var i = 0; i < 5; ++i) { ...