JS中call和apply

来源:互联网 发布:在线大肚照自拍软件 编辑:程序博客网 时间:2024/04/29 16:09

这两天在刷牛客网上的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下的所有方法了。

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

0 0