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 插件之仿“卓越亚马逊”首页弹出菜单效果
Dec 25 Javascript
基于Jquery的淡入淡出的特效基础练习
Dec 13 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 Javascript
javascript学习(二)javascript常见问题总结
Jan 02 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
Jun 25 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
ES6/JavaScript使用技巧分享
Dec 14 Javascript
实例讲解v-if和v-show的区别
Jan 31 Javascript
vue实现计步器功能
Nov 01 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
May 13 Javascript
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
Apr 03 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下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
JavaScript作用域链使用介绍
2013/08/29 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python版的文曲星猜数字游戏代码
2013/09/02 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Python将string转换到float的实例方法
2019/07/29 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
酒店拾金不昧表扬信
2014/01/18 职场文书
工会主席岗位责任制
2014/02/11 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
企业整改报告范文
2014/11/08 职场文书
Pygame Time时间控制的具体使用详解
2021/11/17 Python
Nginx 匹配方式
2022/05/15 Servers
Python日志模块logging用法
2022/06/05 Python