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 相关文章推荐
document.all与WEB标准
May 13 Javascript
基于jquery的表格排序
Sep 11 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
对table和ul实现js分页示例分享
Feb 24 Javascript
jQuery ajax动态生成table功能示例
Jun 14 jQuery
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
Angular4编程之表单响应功能示例
Dec 13 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
JavaScript实现简单轮播图效果
Dec 01 Javascript
利用vue-i18n实现多语言切换效果的方法
Jun 19 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
jQuery实现tab栏切换效果
Dec 22 jQuery
使用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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
Python最基本的输入输出详解
2015/04/25 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
解读! Python在人工智能中的作用
2017/11/14 Python
通过Pandas读取大文件的实例
2018/06/07 Python
关于python字符串方法分类详解
2019/08/20 Python
python多线程实现TCP服务端
2019/09/03 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
大学生大二自我鉴定
2013/10/28 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
对讲机的最大通讯距离是多少
2022/02/18 无线电