ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已。

其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解!

先看明白下面:

例 1

obj.objAge;  // 17
obj.myFun()  // 小张年龄 undefined

例 2

shows()  // 盲僧

比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

1,call()、apply()、bind() 都是用来重定义 this 这个对象的!

如:

obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99

以上出了 bind 方法后面多了个 () 外 ,结果返回都一致!

由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

2,对比call 、bind 、 apply 传参情况下

obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

微妙的差距!

从上面四个结果不难看出:

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )。

apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])。

bind 除了返回是函数以外,它 的参数和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

JavaScript 中 call、apply和bind的用法区别相关推荐

  1. 如何在JavaScript中使用apply(?),call(?)和bind(➰)方法

    by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用apply(?),call(?)和bind(➰)方法 (How to use ...

  2. call,apply,bind的用法与区别

    1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...

  3. JavaScript 中call apply 那点简单事

    谈谈JavaScript 中call apply 那点简单事 平常是否遇到过call apply 的问题 比如说 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply ...

  4. java中的感叹号是_[Java教程]javascript中的2个感叹号的用法

    [Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...

  5. html5有foreach吗,JavaScript中的map()和forEach()有什么区别?

    来源:https://medium.com/better-programming,作者:Moon,翻译:公众号<前端全栈开发者> JavaScript中一些最受欢迎的功能可能是map和fo ...

  6. java两字符串是否相等_Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  7. JavaScript中的name和classname有什么区别

    JavaScript 中的 name 和 className 有如下区别: name 属性通常用于表示 HTML 元素的名称,如表单元素中的 input 元素.它可以用于给服务器发送数据. class ...

  8. 在vue中 storge 和vuex使用的用法区别

    在vue中 storge 和vuex使用的用法区别 1.联动性:storge对于属性的改变不能触发其他页面的改动 storage: 存取login之后就不会改变的信息,比如userId, isAdmi ...

  9. 复习javascript中call,apply,bind的用法

    一直很难理解js中的call apply bind,在w3schools,mdn阅读了,也看了很多相关的文章,今天我来写下我理解的call apply bind 首先创建一个函数 function m ...

最新文章

  1. RocEDU.课程设计2018 第二周进展 博客补交
  2. iphone完整版的http上传请求协议
  3. jpgraph 实例文档
  4. 百度新key申请步骤
  5. apache启服务命令_apache_cgi绕过disable_functions
  6. declare sql语句_每天10分钟学习T-SQL语言基础(Part 5)
  7. 介绍Dynamics 365的OrgDBOrgSettings工具
  8. jzoj1350-游戏(某C组)【SPFA,图,最短路】
  9. jquery中点击切换的实现
  10. Cisco职业认证再认证体系及程序问答
  11. AutoCAD 2022 Mac中文版发布 最好的Mac CAD软件
  12. Redfish Data model (红鱼的资料模型)
  13. 中标麒麟使用centos源_中标麒麟操作系统使用笔记
  14. 局域网SDN技术硬核内幕 三 从物到人——SDN走进园区网络
  15. 攻城狮成长日志(五):远古人工智能,用博弈树实现的五子棋博弈系统(附原码)
  16. 史上最拉跨的导线平差程序 2.0(by C#)
  17. 国庆黄金周即将到来!包容的三亚期待游客前来探索
  18. 初中计算机竞赛面试题目及答案,2019上半年初中信息技术教师资格面试真题及答案(第一批)...
  19. CentOS,Ubuntu,Linux下安装yasm-1.3.0详细说明
  20. python在多继承中子类调用某个父类的同名方法之 super讲解(mro机制)***

热门文章

  1. “老赖”罗永浩:就算“卖艺”也会还债!孙宇晨:我买!
  2. 百度“已死”,百度“真香”
  3. 1哈哈欢迎使用CSDN-markdown编辑器
  4. 使用OpenCV加载TensorFlow2模型
  5. linux里那些依赖包
  6. 22.加密与安全相关,证书申请CA(gpg,openssl)
  7. CentOS7.4下DNS服务器软件BIND安装及相关的配置(一)
  8. Unity3d多线程
  9. shell 读取配置文件
  10. JS控制图片显示的大小(图片等比例缩放)