JS中call和apply

这两天在刷牛客网上的JS能力测评题,然后发现不少的题都涉及到了call和apply函数,第一次使用的时候查了一下文档,懂了大概,结果越往后使用越晕,所以刷完题就赶紧查了很多资料,总结一下两者的用法。

call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。两者的作用是完全一样的,只不过接受的参数是不一样的。
举个栗子,函数example定义如下:

  var example()= function(str1,str2){}

那么,我们就可以通过example.call(this,str1,str2);或者example.aplly(this.str1,str2);来调用。this是我们我们想要指定的上下文,call是需要把参数按顺序传递进去,而apply是把参数放在数组里,也就是将多个参数组合成数组传入。
JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call。而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。

只需要记清楚他们存在的原因,才可以记得牢靠一点:call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。

举个栗子:

 function cat(){}
 cat.prototype={
 food:"fish",
 say:function(){
 return "I"+"love"+this.name;} 
 }
var blackCat = new cat();
blackCat.say();

但是如果我们有一个对象:

whiteDog = {food:"bone"};

我们不想对它重新定义say方法,那么我们可以通过call或apply用blackCat的say方法:

blackCat.say.call(whiteDog);

当然call和apply在JS的用法还有很多,经常用来通过document.getElementsByTagName选择的dom 节点是一种类似array的array。它不能应用Array下的push,pop等方法。我们可以通过:

var domNodes=Array.prototype.slice.call(document.getElements
ByTagName("*"));

这样domNodes就可以应用Array下的所有方法了。

还有实现继承和多重继承的作用,这些等我以后世纪运用到了再来补全吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值