javascript中apply、call和bind的使用区别


Posted in Javascript onApril 05, 2016

在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可以这样:

1.xw.say.call(xh);

对于apply可以这样:

1.xw.say.apply(xh);

而对于bind来说需要这样:

1.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来说是这样的

1.xw.say.call(xh,"实验小学","六年级");      

而对于apply来说是这样的

1.xw.say.apply(xh,["实验小学","六年级"]);

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。

那么bind怎么传参呢?它可以像call那样传参。

1.xw.say.bind(xh,"实验小学","六年级")();

但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

1.xw.say.bind(xh)("实验小学","六年级");

以上这篇javascript中apply、call和bind的使用区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于javascript 回调函数中变量作用域的讨论
Sep 11 Javascript
jquery简单实现外部链接用新窗口打开的方法
May 30 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
JavaScript实现反转字符串的方法详解
Apr 27 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
Aug 07 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
Jul 30 Javascript
js实现上传图片到服务器
Apr 11 Javascript
js判断两个数组相等的5种方法
May 06 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 #Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 #Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 #Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 #Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 #Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 #Javascript
You might like
PHP常用的缓存技术汇总
2014/05/05 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
js 文件引入实现代码
2010/04/23 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
Vue计算属性的使用
2017/08/04 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
Python创建日历实例
2014/08/21 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
在Python中增加和插入元素的示例
2018/11/01 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
劳动模范获奖感言
2015/07/31 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书