全面解析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 相关文章推荐
ExtJs GridPanel简单的增删改实现代码
Aug 26 Javascript
jquery maxlength使用说明
Sep 09 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
基于jquery实现发送文章到手机的代码
Dec 26 Javascript
基于jQuery实现的旋转彩圈实例
Jun 26 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
Mar 13 Javascript
vue生命周期的探索
Apr 03 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
javascript面向对象创建对象的方式小结
Jul 29 Javascript
vue基于v-charts封装双向条形图的实现代码
Dec 09 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数组是否为空的代码
2011/09/08 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
vue实现简单的星级评分组件源码
2018/11/16 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
获取Django项目的全部url方法详解
2017/10/26 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
如何把python项目部署到linux服务器
2020/08/26 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
2014年妇联工作总结
2014/11/21 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
Win11软件图标固定到任务栏
2022/04/19 数码科技