javascript中call,apply,bind的区别详解


Posted in Javascript onDecember 11, 2020

在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢。

在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。

那么他们的区别在哪里的,先看一个例子。

var xw = {
     name : "小王",
     gender : "男",
     age : 24,
     say : function() {
       alert(this.name + " , " + this.gender + " ,今年" + this.age);                
        }
     }
     var xh = {
       name : "小红",
       gender : "女",
       age : 18
       }
     xw.say();

显示的肯定是小王 , 男 , 今年24。
那么如何用xw的say方法来显示xh的数据呢。
对于call可以这样:

xw.say.call(xh);

对于apply可以这样:

xw.say.apply(xh);

而对于bind来说需要这样:

xw.say.bind(xh)();

如果直接写xw.say.bind(xh)是不会有任何结果的,看到区别了吗?call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
那么call和apply有什么区别呢?我们把例子稍微改写一下。

var xw = {
            name : "小王",
            gender : "男",
            age : 24,
            say : function(school,grade) {
                alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);                
            }
        }
        var xh = {
            name : "小红",
            gender : "女",
            age : 18
        }

可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
对于call来说是这样的

xw.say.call(xh,"实验小学","六年级");

而对于apply来说是这样的

xw.say.apply(xh,["实验小学","六年级"]);

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它可以像call那样传参。

xw.say.bind(xh,"实验小学","六年级")();

但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

xw.say.bind(xh)("实验小学","六年级");

以上就是javascript中call,apply,bind的区别详解的详细内容,更多关于JavaScript call,apply,bind的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
使用AngularJS对路由进行安全性处理的方法
Jun 18 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
解决给dom元素绑定click等事件无效问题的方法
Feb 17 Javascript
AngularJS中使用ngModal模态框实例
May 27 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
Node.js利用console输出日志文件的方法示例
Apr 27 Javascript
vue头部导航动态点击处理方法
Nov 02 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
使用js获取身份证年龄的示例代码
Dec 11 #Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 #Vue.js
node koa2 ssr项目搭建的方法步骤
Dec 11 #Javascript
uni-app 自定义底部导航栏的实现
Dec 11 #Javascript
微信小程序实现音乐播放页面布局
Dec 11 #Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 #Javascript
JS实现京东商品分类侧边栏
Dec 11 #Javascript
You might like
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP学习之正则表达式
2011/04/17 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
js动态为代码着色显示行号
2013/05/29 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
python概率计算器实例分析
2015/03/25 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
python通过cython加密代码
2020/12/11 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
幼儿园师德师风学习材料
2014/05/29 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
大学生党性分析材料
2014/12/19 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
九九重阳节致辞
2015/07/31 职场文书
电台广播稿范文
2015/08/19 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers