全面解析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 相关文章推荐
一个可绑定数据源的jQuery数据表格插件
Jul 17 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
Dec 08 Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 Javascript
angularjs指令中的compile与link函数详解
Dec 06 Javascript
jQuery实现给页面换肤的方法
May 30 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
react native与webview通信的示例代码
Sep 25 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
Vuex入门到上手教程
Jun 20 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 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
PHP技术开发技巧分享
2010/03/23 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python闭包之返回函数的函数用法示例
2018/01/27 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
物流毕业生个人的自我评价
2014/02/13 职场文书
中药专业自荐信范文
2014/03/18 职场文书
开学寄语大全
2014/04/08 职场文书
工程安全生产协议书
2014/11/21 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
升学宴家长答谢词
2015/09/29 职场文书
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS
人民币符号
2022/02/17 杂记