最开始关于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对比和使用的更多相关文章

  1. bind(),call(), apply()方法的区别是什么?

    bind(),call(), apply()方法的区别是什么? 共同点:改变this指向,任何调用都不在起作用 bind() 改变this的指向,不会调用函数,返回一个新的函数 var o ={a:' ...

  2. JavaScript中的bind,call和apply函数的用法和区别

    一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...

  3. Function.apply.bind()与Function.apply.bind()

    1.Function.apply.bind(…) 我在学习promise部分的时候遇到了这样的代码: Promise.resolve([10,20]).then(Function.apply.bind ...

  4. Apply,Call,bind对比

    apply.call call和apply都是为了改变上下文背景存在的,即改变函数内部指向 javascript一大特点是函数存在定义时的上下文,运行时的上下文和上下文可改变的概念 apply.cal ...

  5. 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别

    JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...

  6. 深入浅出 妙用Javascript中apply、call、bind

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  7. 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...

  8. 改变this指针的apply,call,bind的区别

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  9. (转)深入浅出 妙用Javascript中apply、call、bind

    原文连接 深入浅出 妙用Javascript中apply.call.bind 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且 ...

随机推荐

  1. 第二章 ArrayList源码解析

    一.对于ArrayList需要掌握的七点内容 ArrayList的创建:即构造器 往ArrayList中添加对象:即add(E)方法 获取ArrayList中的单个对象:即get(int index) ...

  2. 关于overflow的问题

    <head> <title></title> <style type="text/css"> body { margin: 0; p ...

  3. R语法学习 第十二篇:因子

    因子(factor)是R语言中比较特殊的一个类型, 它是一个用于存储类别的类型,因子的行为有时像字符串,有时像整数.因子也是一个向量,每个元素都是字符类型.因子具有因子水平(Levels),用于限制因 ...

  4. Python_跟随目标主机IP变换

    ''' 为了防止黑客攻击或者负载均衡,会经常变换主机,这样同一个域名在不同时间可能会对应不同的IP地址,在这种情况下可以通过 socket模块的gethostbyname()函数来实时获取目标主机的I ...

  5. Scrapy爬虫框架补充内容三(代理及其基本原理介绍)

    前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...

  6. Axios源码深度剖析 - 替代$.ajax,成为xhr的新霸主

    前戏 在正式开始axios讲解前,让我们先想想,如何对现有的$.ajax进行简单的封装,就可以直接使用原声Promise了? let axios = function(config){ return ...

  7. 基于支付系统真实场景的分布式事务解决方案效果演示: http://www.iqiyi.com/w_19rsveqlhh.html

    基于支付系统真实场景的分布式事务解决方案效果演示:http://www.iqiyi.com/w_19rsveqlhh.html

  8. Pat1067:Sort with Swap(0,*)

    1067. Sort with Swap(0,*) (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...

  9. Reflection的getCallerClass静态方法

    Reflection的getCallerClass的使用 博客分类: java基础   Reflection的getCallerClass的使用:可以得到调用者的类.这个方法是很好用的. 0 和小于0 ...

  10. SSM-SpringMVC-03:SpringMVC执行流程一张有意思的图

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上次的图也不全,这次的图也不是完整版,但是多了一个拦截器,我觉得挺有意思的,我就放上来了 他Handler ...