全面解析JavaScript中apply和call以及bind(推荐)


Posted in Javascript onJune 15, 2016

函数调用方法

在谈论JavaScript中apply、call和bind这三兄弟之前,我想先说下,函数的调用方式有哪些:

•作为函数

•作为方法

•作为构造函数

•通过它们的call()和apply()方法间接调用

前面的三种调用方法,我们都知道且不在这篇文章的讨论范围内,就不说了。

下面我们来说说这第四种调用方法

通过call()和apply()间接调用

其实,我们可以将这两个函数看做是某个对象的方法,通过调用方法的方式来间接调用函数:

function f(){}
f.call(o);
f.apply(o);

call()和apply()的第一个参数是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。

那么他们是一样的,还是有区别的,还有bind方法呢?君莫急,下面详细的解析他们三者的区别和联系。

call()

call()方法给调用它的方法指定特定的this指针(习惯用语,不要和我纠结它的正确性)和参数。例如有这么一个函数:

var fn = function (arg1, arg2) {
console.log(this, arg1, arg2); 
}

我来调用它:

fn.call(null, 'Skylor', 'min'); //1
fn.call(undefined, 'Skylor', 'min'); //2
var fx = function() {}
fn.call(fx, 'Skylor', 'min'); //3

这三个call方法的返回值是什么呢?不废话,请看:

1. null "Skylor" "min"
2. undefined "Skylor" "min"
3. fx "Skylor" "min"

真的是这样吗,机智的你,去浏览器控制台小试了一下,我去,你这坑货,不是这样的:

chrome
1. Window "Skylor" "min"
2. Window "Skylor" "min"
3. fx "Skylor" "min"

好吧,你机智。但这已经很好的说明了call方法了。(window很高级,微软偷笑中...)

我们注意到call方法,第一个参数是指定this指针,后面每个参数指定需要的参数,注意我用的是“每个”,这意味着你需要几个参数就要想调用函数那样,一个个参数写进去。

apply()

apply()是call()的兄弟啊,其他地方长的都一样,都是男的,就一个地方不一样。先看例子:

fn.apply(null, ['Skylor', 'min']); //1
fn.apply(fx, ['Skylor', 'min']); //2

哥们,你是不是写错了,多了个中括号啊。不,不,不,这就是他和call长的不一样的地方,它的第二个参数是个需要的参数Array。

bind()

bind()嘛,他们三个不是仨兄弟嘛,,这个我懂,blabla....不不不,它是和apply、call结拜的兄弟,不是亲兄弟。

当然,bind方法也是允许你指定this指针,但是它不是调用函数,而是返回一个(或者说是拷贝)调用它的函数的函数,并给这个函数指定特定的this指针和参数。惯例,例子说明一切:

var fnbound = fn.bind(null, 'Skylor', 'min');

这时,fnbound是一个函数,一个this指向null,参数为['Skylor', 'min']的另一个函数。调用之:

fnbound();

结果:

null, 'Skylor', 'min'

不要和我纠结Window的事了。。。。。

bind和其他两个兄弟不一样的地方,是,它不是调用函数,而是返回一个新的函数,同样,它也是指定this指针和参数的,指定参数的方式和call一样,是一个一个来的。

最后来一个例子呗:

var shoppingCart = (function(){
var _calculatePrice = function () {
return this.price * this.amount;
};
return {
calculatePrice : _calculatePrice
}
})();
var goods = {
name : ‘hammer',
price: 199,
amount : 2
};
shoppingCart.calculatePrice.call(goods);

到此结束。!

以上所述是小编给大家介绍的JavaScript中apply和call以及bind(推荐)的全部内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript数组去掉重复
May 12 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
Vue.js实战之组件之间的数据传递
Apr 01 Javascript
r.js来合并压缩css文件的示例
Apr 26 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 Javascript
Vue+Element-U实现分页显示效果
Nov 15 Javascript
JavaScript仿flash遮罩动画效果
Jun 15 #Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 #Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 #Javascript
浅谈js里面的InttoStr和StrtoInt
Jun 14 #Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 #Javascript
JS递归遍历对象获得Value值方法技巧
Jun 14 #Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
Jun 14 #Javascript
You might like
重置版战役片段
2020/04/09 魔兽争霸
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
javascript实现微信分享
2014/12/23 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
Python hashlib模块用法实例分析
2018/06/12 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
泰国网上购物:Shopee泰国
2018/09/14 全球购物
一套SQL笔试题
2016/08/14 面试题
初三学生个人自我评定
2014/04/06 职场文书
班主任对学生的评语
2014/04/26 职场文书
法律顾问服务方案
2014/05/15 职场文书
小学生安全责任书
2014/07/25 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
网络营销实训总结
2015/08/03 职场文书
交通安全主题班会
2015/08/12 职场文书
创业计划书之酒店
2019/08/30 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js