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的认识,并且 ...
随机推荐
- Beta 冲刺day3
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是对第三方与企业复杂的逻辑关系进行分析和优化,以及进行部分模块的功能测试和代码测试. 今天解决的进度:根据前天得到的需求问题进行 ...
- ArcCore重构-Platform_Types.h实现辨析
AUTOSAR定义了一系列PlatformTypes,如uint8/uint16/uint32等等基本类型. It contains all platform dependent types and ...
- 几张图帮你理解 docker 基本原理及快速入门
写的非常好的一篇文章,不知道为什么被删除了. 利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...
- EasyUI集成Kindeditor使用
在实际的项目中,我们需要在项目中集成富文本编辑器,而kindeditor作为一款优良的编辑器,在项目中或多或少都会用到! 实际效果图 使用方法: 1.首先下载Kindeditor编辑器,我这里 ...
- 功能强大的swagger-editor的介绍与使用
一.Swagger Editor简介 Swagger Editor是一个开源的编辑器,并且它也是一个基于Angular的成功案例.在Swagger Editor中,我们可以基于YAML等语法定义我们的 ...
- Java中创建线程的三种方式及其优缺点
1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...
- springmvc配置详解 教程
https://www.cnblogs.com/sunniest/p/4555801.html
- Python xml处理模块
---恢复内容开始--- xml 通过< >节点来区别数据结构 ---恢复内容结束--- xml 通过< >节点来区别数据结构 <xml version='1.0'> ...
- 【树形dp】Bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏
Description 约翰意识到贝茜建设网络花费了他巨额的经费,就把她解雇了.贝茜很愤怒,打算狠狠报 复.她打算破坏刚建成的约翰的网络. 约翰的网络是树形的,连接着N(1≤N≤1000 ...
- 【状压dp】Bzoj2064 分裂
Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...