全面解析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 相关文章推荐
预加载css或javascript的js代码
Apr 23 Javascript
javascript中处理时间戳为日期格式的方法
Jan 02 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
Oct 25 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
解决cordova+vue 项目打包成APK应用遇到的问题
May 10 Javascript
详解ECMAScript2019/ES10新属性
Dec 06 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
Jul 26 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
Sep 16 Javascript
javascript实现打砖块小游戏(附完整源码)
Sep 18 Javascript
javascript实现左右缓动动画函数
Nov 25 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 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
thinkphp模板继承实例简述
2014/11/26 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
js event事件的传递与冒泡处理
2009/12/06 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现子类调用父类的方法
2014/11/10 Python
python解析基于xml格式的日志文件
2017/02/25 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python是怎样处理json模块的
2020/07/16 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
最热门的自我评价
2013/12/30 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
医院搬迁方案
2014/06/14 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
委托书的样本
2015/01/28 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
Python+Appium自动化测试的实战
2021/06/30 Python