今天被人问到js中的call,apply的区别和用途,解释了一番后,想到以前在逼乎上看到一位小伙伴生动形象的解释javascript
自己不难理解,看下MDN就知道了,可是不经常使用,遇到了,还要脑回路回转下。或者时间长了,仍是要肯定下去看下文档,为了方便记忆:java
猫吃鱼,狗吃肉,奥特曼打小怪兽。数组
有天狗想吃鱼了app
猫.吃鱼.call(狗,鱼)dom
狗就吃到鱼了this
猫成精了,想打怪兽spa
奥特曼.打小怪兽.call(猫,小怪兽)prototype
或者 马云.赚钱.call(我)code
还有一位杨志大佬解释的更清楚对象
function cat(){ } cat.prototype={ food:"fish", say: function(){ alert("I love "+this.food); } } var blackCat = new cat; blackCat.say();
可是若是咱们有一个对象 whiteDog = {food:"bone"}, 咱们不想对它从新定义say方法,
那么咱们能够经过call或apply用blackCat的say方法:blackCat.say.call(whiteDog);
因此,能够看出call和apply是为了动态改变this而出现的,当一个object没有某个方法,可是其余的有,咱们能够借助call或apply用其它对象的方法来操做。
用的比较多的,经过document.getElementsByTagName选择的dom 节点是一种相似array的array。
它不能应用Array下的push,pop等方法。咱们能够经过:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
这样domNodes就能够应用Array下的全部方法了。
其余的就不提了,讲多了反而迷惑。call 和apply的用法都是同样的,知识传参不一样,apply是数组,call是参数
就这样记住了。