全面解析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脚本
Aug 04 Javascript
jQuery+ajax实现顶一下,踩一下效果
Jul 17 Javascript
JQUERY获取form表单值的代码
Jul 17 Javascript
JQuery.closest(),parent(),parents()寻找父结点
Feb 17 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
Nov 30 Javascript
用jQuery实现可输入多选下拉组合框实例代码
Jan 18 Javascript
jQuery实现获取h1-h6标题元素值的方法
Mar 06 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
JS动画定时器知识总结
Mar 23 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
你了解vue3.0响应式数据怎么实现吗
Jun 07 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中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
深入php处理整数函数的详解
2013/06/09 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
Python @property装饰器原理解析
2020/01/22 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
同学聚会老师邀请函
2014/01/28 职场文书
会走路的树教学反思
2014/02/20 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
赔偿协议书范本
2014/09/12 职场文书
铁路安全反思材料
2014/12/24 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python