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的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
JavaScript Promise启示录
Aug 12 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
javascript数组去重小结
Mar 07 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
详解Vue中一种简易路由传参办法
Sep 15 Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
Jan 07 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
js文字滚动停顿效果代码
2008/06/28 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
python中bisect模块用法实例
2014/09/25 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python集合是否可变总结
2019/06/20 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
python numpy数组复制使用实例解析
2020/01/10 Python
python——全排列数的生成方式
2020/02/26 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
恐龙的灭绝教学反思
2014/02/12 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python