彻底搞懂JavaScript中的apply和call方法(必看)
call和apply都是为了改变某个函数运行的context上下文而存在的,即为了改变函数体内部this的指向。因为JavaScript的函数存在定义上下文和运行时上下文以及上下文是可以改变的概念。
回到目录定义
fun.apply(thisArg, [argsArray]) fun.call(thisArg, arg1,arg2, ...)
其中thisArg可以为null或undefined,此时表示全局对象,更详细见MDN:apply()、call()
二者的作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下
var func1 = function(arg1, arg2){};
可以通过func1.call(this, arg1, arg2);或者func1.apply(this, [arg1, arg2])来调用。其中this是你想指定的上下文,它可以是任意一个JavaScript对象(JavaScript一切皆对象),call需要把参数传递进去,而apply则把参数放在数组里。
因为在JavaScript中,某个函数的参数数量是不固定的,当你的参数明确知道数量时,用call,而不确定的时候用apply,然后把参数push进数组传递进去。当参数数量不确定时,函数内部也可以通过arguments这个数组来遍历所有的参数。
回到目录一个例子
在JavaScript OOP中,我们经常会这样定义
funciton programmer() { } programmer.prototype = { hobby: 'programming', say.function() { alert('I love' + this.hobby); } } var xiaoMing = new programmer(); xiaoMing.say();
此时如果我们有一个设计妹子对象xiaoHua = {hobby: 'designing'};我们不想对它重新定义say方法,那么我们可以通过call或apply使用xiaoMing的say方法xiaoMing.say.call(xiaoHua)。
由此可看出,call和apply都是为了动态改变this而出现的,当一个object没有某个方法或属性时,其他的对象有,则可以借助call或apply来使用其他对象的方法来操作。
obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]);
两者都是把obj(即this)绑定到thisObj,这时候thisObj具备(或继承)了obj的属性和方法
其中比较常见的,通过document.getElementByTagName选择的节点是一种类数组,它不能应用Array下的push,pop等方法。但我们可以通过
var domNodes = Array.prototype.slice.call(document.getElementsByTagName(""));
Array.prototype.slice.call能所有具有length属性的对象转为数组,这样domNodes就可以应用Array下的所有方法了。
以上这篇彻底搞懂JavaScript中的apply和call方法(必看)就是长沙网络推广分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持狼蚁SEO。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指