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中filter()和find()的区别深入了解
Sep 25 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
JS获取地址栏参数的几种方法小结
Feb 28 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
jQuery实现动态删除LI的方法
May 30 jQuery
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
记一次vue-webpack项目优化实践详解
Feb 17 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
一个炫酷的Bootstrap导航菜单
2016/12/28 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
python从入门到精通(DAY 1)
2015/12/20 Python
Python随机读取文件实现实例
2017/05/25 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python画图常规设置方式
2020/03/05 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
商业项目策划方案
2014/06/05 职场文书
单位单身证明样本
2014/10/11 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
2014年教研室工作总结
2014/12/06 职场文书
优秀班集体申报材料
2014/12/25 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
同事打架检讨书
2015/05/06 职场文书
《穷人》教学反思
2016/02/19 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers