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 相关文章推荐
Node.js异步I/O学习笔记
Nov 04 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
基于bootstrap3和jquery的分页插件
Jul 31 Javascript
Jquery ajax请求导出Excel表格的实现代码
Jun 08 Javascript
AngularJS 与百度地图的结合实例
Oct 20 Javascript
js倒计时显示实例
Dec 11 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
JSON 数据格式详解
Sep 13 Javascript
详解Web使用webpack构建前端项目
Sep 23 Javascript
Nuxt配合Node在实际生产中的应用详解
Aug 07 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
小程序实现背景音乐播放和暂停
Jun 19 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之第四天
2006/10/09 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
js的一些常用方法小结
2011/06/29 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
javascript的BOM
2016/05/03 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
OpenCV实现人脸识别
2017/04/07 Python
python程序控制NAO机器人行走
2019/04/29 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
企业新年寄语
2014/04/04 职场文书
厨房管理计划书
2014/04/27 职场文书
公司授权委托书范文
2014/08/02 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
画展观后感
2015/06/17 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
pytorch 如何使用float64训练
2021/05/24 Python
如何在Python中妥善使用进度条详解
2022/04/05 Python
Linux中如何安装并部署Redis
2022/04/18 Servers