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 图片上一张下一张链接效果代码
Mar 12 Javascript
jQuery select操作控制方法小结
May 26 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 Javascript
javascript 对象数组根据对象object key的值排序
Mar 09 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 Javascript
linux 后台运行node服务指令方法
May 23 Javascript
微信小程序实现购物页面左右联动
Feb 15 Javascript
使用layer.msg 时间设置不起作用的解决方法
Sep 12 Javascript
使用p5.js临摹动态图形
Oct 23 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
用php和MySql来与ODBC数据连接
2006/10/09 PHP
织梦模板标记简介
2007/03/11 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
JS input 数字验证代码
2009/07/30 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
token 机制和实现方式
2020/12/15 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
python3爬虫怎样构建请求header
2018/12/23 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
优秀护士获奖感言
2014/02/20 职场文书
管理提升方案
2014/06/04 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
劳动仲裁调解书
2015/05/20 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS