全面解析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实现页面打印功能实例代码(附去页眉页脚功能代码)
Dec 15 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
javascript 终止函数执行操作
Feb 14 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
angular双向绑定模拟探索
Dec 26 Javascript
vue左右侧联动滚动的实现代码
Jun 06 Javascript
Angular2之二级路由详解
Aug 31 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
浅谈VUE中演示v-for为什么要加key
Jan 16 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
Apr 20 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 Javascript
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP数组实例总结与说明
2011/08/23 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
java必学必会之static关键字
2015/12/03 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
如何让Java程序执行效率更高
2014/06/25 面试题
店长岗位职责
2013/11/21 职场文书
单位单身证明范本
2014/01/11 职场文书
社区平安建设方案
2014/05/25 职场文书
优秀教师推荐材料
2014/12/16 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
推销搭讪开场白
2015/05/28 职场文书
cf战队宣传语
2015/07/13 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书