微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

全面解析JavaScript中apply和call以及bind(推荐)

函数调用方法

在谈论JavaScript中apply、call和bind这三兄弟之前,我想先说下,函数调用方式有哪些:

•作为函数

•作为方法

•作为构造函数

•通过它们的call()和apply()方法间接调用

前面的三种调用方法,我们都知道且不在这文章的讨论范围内,就不说了。

下面我们来说说这第四种调用方法

通过call()和apply()间接调用

其实,我们可以将这两个函数看做是某个对象的方法,通过调用方法的方式来间接调用函数

rush:js;"> function f(){} f.call(o); f.apply(o);

call()和apply()的第一个参数是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。

那么他们是一样的,还是有区别的,还有bind方法呢?君莫急,下面详细的解析他们三者的区别和联系。

call()

call()方法调用它的方法指定特定的this指针(习惯用语,不要和我纠结它的正确性)和参数。例如有这么一个函数

rush:js;"> var fn = function (arg1,arg2) { console.log(this,arg1,arg2); }

我来调用它:

rush:js;"> fn.call(null,'Skylor','min'); //1 fn.call(undefined,'min'); //2 var fx = function() {} fn.call(fx,'min'); //3

这三个call方法的返回值是什么呢?不废话,请看:

rush:js;"> 1. null "Skylor" "min" 2. undefined "Skylor" "min" 3. fx "Skylor" "min"

真的是这样吗,机智的你,去浏览器控制台小试了一下,我去,你这坑货,不是这样的:

rush:js;"> chrome 1. Window "Skylor" "min" 2. Window "Skylor" "min" 3. fx "Skylor" "min"

好吧,你机智。但这已经很好的说明了call方法了。(window很高级,微软偷笑中...)

我们注意到call方法,第一个参数是指定this指针,后面每个参数指定需要的参数,注意我用的是“每个”,这意味着你需要几个参数就要想调用函数那样,一个个参数写进去。

apply()

apply()是call()的兄弟啊,其他地方长的都一样,都是男的,就一个地方不一样。先看例子:

rush:js;"> fn.apply(null,['Skylor','min']); //1 fn.apply(fx,'min']); //2

哥们,你是不是写错了,多了个中括号啊。不,不,不,这就是他和call长的不一样的地方,它的第二个参数是个需要的参数Array。

bind()

bind()嘛,他们三个不是仨兄弟嘛,,这个我懂,blabla....不不不,它是和apply、call结拜的兄弟,不是亲兄弟。

当然,bind方法也是允许你指定this指针,但是它不是调用函数,而是返回一个(或者说是拷贝)调用它的函数函数,并给这个函数指定特定的this指针和参数。惯例,例子说明一切:

rush:js;"> var fnbound = fn.bind(null,'min');

这时,fnbound是一个函数一个this指向null,参数为['Skylor','min']的另一个函数调用之:

fnbound();

结果:

null,'min'

不要和我纠结Window的事了。。。。。

bind和其他两个兄弟不一样的地方,是,它不是调用函数,而是返回一个新的函数,同样,它也是指定this指针和参数的,指定参数的方式和call一样,是一个一个来的。

最后来一个例子呗:

rush:js;"> 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(推荐)的全部内容。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可分享给好友!感谢支持

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐