JavaScript 中 call、apply和bind的用法区别
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的用法区别相关推荐
- 如何在JavaScript中使用apply(?),call(?)和bind(➰)方法
by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用apply(?),call(?)和bind(➰)方法 (How to use ...
- call,apply,bind的用法与区别
1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...
- JavaScript 中call apply 那点简单事
谈谈JavaScript 中call apply 那点简单事 平常是否遇到过call apply 的问题 比如说 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply ...
- java中的感叹号是_[Java教程]javascript中的2个感叹号的用法
[Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...
- html5有foreach吗,JavaScript中的map()和forEach()有什么区别?
来源:https://medium.com/better-programming,作者:Moon,翻译:公众号<前端全栈开发者> JavaScript中一些最受欢迎的功能可能是map和fo ...
- java两字符串是否相等_Java与JavaScript中判断两字符串是否相等的区别
JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...
- JavaScript中的name和classname有什么区别
JavaScript 中的 name 和 className 有如下区别: name 属性通常用于表示 HTML 元素的名称,如表单元素中的 input 元素.它可以用于给服务器发送数据. class ...
- 在vue中 storge 和vuex使用的用法区别
在vue中 storge 和vuex使用的用法区别 1.联动性:storge对于属性的改变不能触发其他页面的改动 storage: 存取login之后就不会改变的信息,比如userId, isAdmi ...
- 复习javascript中call,apply,bind的用法
一直很难理解js中的call apply bind,在w3schools,mdn阅读了,也看了很多相关的文章,今天我来写下我理解的call apply bind 首先创建一个函数 function m ...
最新文章
- RocEDU.课程设计2018 第二周进展 博客补交
- iphone完整版的http上传请求协议
- jpgraph 实例文档
- 百度新key申请步骤
- apache启服务命令_apache_cgi绕过disable_functions
- declare sql语句_每天10分钟学习T-SQL语言基础(Part 5)
- 介绍Dynamics 365的OrgDBOrgSettings工具
- jzoj1350-游戏(某C组)【SPFA,图,最短路】
- jquery中点击切换的实现
- Cisco职业认证再认证体系及程序问答
- AutoCAD 2022 Mac中文版发布 最好的Mac CAD软件
- Redfish Data model (红鱼的资料模型)
- 中标麒麟使用centos源_中标麒麟操作系统使用笔记
- 局域网SDN技术硬核内幕 三 从物到人——SDN走进园区网络
- 攻城狮成长日志(五):远古人工智能,用博弈树实现的五子棋博弈系统(附原码)
- 史上最拉跨的导线平差程序 2.0(by C#)
- 国庆黄金周即将到来!包容的三亚期待游客前来探索
- 初中计算机竞赛面试题目及答案,2019上半年初中信息技术教师资格面试真题及答案(第一批)...
- CentOS,Ubuntu,Linux下安装yasm-1.3.0详细说明
- python在多继承中子类调用某个父类的同名方法之 super讲解(mro机制)***
热门文章
- “老赖”罗永浩:就算“卖艺”也会还债!孙宇晨:我买!
- 百度“已死”,百度“真香”
- 1哈哈欢迎使用CSDN-markdown编辑器
- 使用OpenCV加载TensorFlow2模型
- linux里那些依赖包
- 22.加密与安全相关,证书申请CA(gpg,openssl)
- CentOS7.4下DNS服务器软件BIND安装及相关的配置(一)
- Unity3d多线程
- shell 读取配置文件
- JS控制图片显示的大小(图片等比例缩放)