浅谈javascript中call()、apply()、bind()的用法


Posted in Javascript onApril 20, 2015

call(thisObj,arg1,arg2...)、apply(thisObj,[obj1,obj2...])这二个方法是每个函数都包含的非继承的方法

call(thisobj[, args])和apply(thisobj[, args])

作用都是一样的,简单来说就是改变当前使用该方法的对象中的this指向,指向调用方法中的thisObj对象二者的区别(第一个参数是相同的)就是call方法中传入的参数是是一个个列举出来的,而apply方法中的参数二是一个数组

还是举例说明比较直观:

window.color='red';
var o={color:"blue"};
function sayColor(){
alert(this.color);
};
sayColor(); //red(全局函数,this是window)
sayColor.call(this);//red(调用call方法,指定对象是this,这里的this是window,没什么意义)
sayColor.call(window);//red(调用call方法,指定对象是window,没什么意义)
sayColor.call(o); //blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)
sayColor.apply(o);//blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)

ECMAScript5中的bind()方法和前二种方法相似,bind()这个方法会创建一个函数的实例,这个实例的this值会被绑定到传递给bind()函数的值

例子:

function a(y){
return this.x+y;
};
var o={x:1};
var g=a.bind(o);
g(2);//3

从例子中可以看出函数a绑定到对象o上了,并且返回了新的函数g,调用g时,a函数会当作对象o的方法来调用 
bind()这个方法是将函数绑定到某个对象上,并且返回一个新的函数,这个新函数中传入的参数都将传入被绑定的函数上。

下面来看看他们的区别

在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 相关文章推荐
MooTools 1.2介绍
Sep 14 Javascript
JavaScript 学习初步 入门教程
Mar 25 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
Dec 10 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
Aug 22 Javascript
JavaScript创建对象的四种常用模式实例分析
Jan 11 Javascript
利用Angular7开发一个Radio组件的全过程
Jul 11 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
javascript中callee与caller的区别分析
Apr 20 #Javascript
javascript正则表达式中的replace方法详解
Apr 20 #Javascript
javascript正则表达式基础知识入门
Apr 20 #Javascript
javascript实现表单提交后,提交按钮不可用的方法
Apr 18 #Javascript
Javascript实现颜色rgb与16进制转换的方法
Apr 18 #Javascript
JS解析XML文件和XML字符串详解
Apr 17 #Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 #Javascript
You might like
xml+php动态载入与分页
2006/10/09 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
jquery密码强度校验
2015/12/02 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
Apache如何部署django项目
2017/05/21 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
运动会广播稿100字
2014/09/14 职场文书
学前班语言教学计划
2015/01/20 职场文书
大学军训口号大全
2015/12/24 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
Apache POI的基本使用详解
2021/11/07 Servers