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 相关文章推荐
利用javascript查看html源文件
Nov 08 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
May 06 Javascript
JS对字符串编码的几种方式使用指南
May 14 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
Vue.js每天必学之内部响应式原理探究
Sep 07 Javascript
angular4模块中给标签添加背景图的实现方法
Sep 15 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
js实现简单页面全屏
Sep 17 Javascript
Javascript中的this,bind和that使用实例
Dec 05 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 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的FTP学习(四)
2006/10/09 PHP
PHP正则验证Email的方法
2015/06/15 PHP
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
js实现小时钟效果
2020/03/25 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
美国电视购物HSN官网:HSN
2016/09/07 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
校庆标语集锦
2014/06/25 职场文书
新学期开学标语
2014/06/30 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript