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下的动画处理总结
Oct 10 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
jQuery实现三级菜单的代码
May 09 Javascript
JavaScript实现替换字符串中最后一个字符的方法
Mar 07 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
angularJS自定义directive之带参方法传递详解
Oct 09 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
Apr 29 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/03 新手入门
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
一个简单的php路由类
2016/05/29 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技