全面解析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 相关文章推荐
JS实现字体选色板实例代码
Nov 20 Javascript
js封装可使用的构造函数继承用法分析
Jan 28 Javascript
javascript实现网页字符定位的方法
Jul 14 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
微信公众号H5之微信分享常见错误和问题(小结)
Nov 14 Javascript
微信小程序服务器日期格式化问题
Jan 07 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 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
PHP中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
JS 时间显示效果代码
2009/08/23 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
最小二乘法及其python实现详解
2020/02/24 Python
COS美国官网:知名服装品牌
2019/04/08 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
服务生自我鉴定
2014/01/22 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
仓管岗位职责范本
2014/02/08 职场文书
优秀党员事迹材料
2014/12/18 职场文书
2015年测量员工作总结
2015/05/23 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python