最开始关于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. django自定义用户表

    django中已经给我生成默认的User表,其中的字段已经可以满足我们的日常需求. 但有时候,我们需要更多的字段,我们就可以自定义.来替换django自带的User表. #models.py from ...

  2. mac下的readelf和objdump

    ELF文件包括: (1)可重定位的目标文件 (2)可执行的目标文件 (3)可被共享的目标文件 可以用file命令来看目标文件是否是ELF文件 在linux下,用readelf来看ELF头部或者其它各s ...

  3. 快速失败(fail-fast)和安全失败(fail-safe)的区别

    1.fail-fast和fail-safe比较 Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响.java.util包下面的所有的集合类都是快速失败的,而java.ut ...

  4. SSM-Spring-13:Spring中RegexpMethodPointcutAdvisor正则方法切入点顾问

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- RegexpMethodPointcutAdvisor:正则方法切入点顾问 核心: <property ...

  5. ORALCE删除临时表空间的方法---解决ORA01033: oralce initialization or shutdown in progress方案

    当一台主机上oralce 临时表空间太多,而又用不到这些临时表空间的时候,    TABLESPACE 会占用大量的存储空间.本文介绍一种删除ORACLE 临时表空间的方法. 一 启动任务管理器.在任 ...

  6. Mybatis Generator生成数据库自带的中文注释

    1.相关jar包 <!-- mybatis生成 jar包 --> <dependency> <groupId>org.mybatis.generator</g ...

  7. 沉默的螺旋--digest

    孤立的恐惧对名望的追求高度的和谐和共识是大部分人的幸福感.安全感的源头公开性能让某种行为具有社会可接受性 P5谈论和沉默决定了意见气候那些被新的东方政策说服的人,感觉自己所想的都是合理的.因此他们就会 ...

  8. nake_api_protect 请求保护器——防止请求被恶意刷

    github : https://github.com/xjnotxj/wechat_interaction_auth -- nake_api_protect 接口请求保护器,根据 频率 + 次数 的 ...

  9. 『个人の笔记』百度ife

    ✄--------------------------------------------task1分割线--------------------------------------------✄ 百 ...

  10. linux安装tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

    这两天我们的开发机重启了好几次,发现每次重启后我的tomcat总是没有启动.检查java路径,配置正确,后来拿普通账号启动tomcat时报如下的错: Neither the JAVA_HOME nor ...