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 相关文章推荐
翻译整理的jQuery使用查询手册
Mar 07 Javascript
关于JavaScript中原型继承中的一点思考
Jul 25 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
node.js中的dns.getServers方法使用说明
Dec 08 Javascript
javascript面向对象之对象的深入理解
Jan 13 Javascript
JS实现的生成随机数的4个函数分享
Feb 11 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
Aug 11 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
vue实现a标签点击高亮方法
Mar 17 Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
Oct 24 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
终于听上了直流胆调频
2021/03/02 无线电
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
浅谈function(函数)中的动态参数
2017/04/30 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
python assert的用处示例详解
2019/04/01 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python3处理word文档实例分析
2020/12/01 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
水产养殖学应届生求职信
2013/09/29 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
新学期决心书
2014/03/11 职场文书
质量管理标语
2014/06/12 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
房屋租赁意向书范本
2015/05/09 职场文书