今天被人问到js中的call,apply的区别和用途,解释了一番后,想到之前在逼乎上看到一位小伙伴生动形象的解释

本身不难理解,看下MDN就知道了,但是不常用,遇到了,还要脑回路回转下。或者时间长了,还是要确定下去看下文档,为了方便记忆:

猫吃鱼,狗吃肉,奥特曼打小怪兽。

有天狗想吃鱼了

猫.吃鱼.call(狗,鱼)

狗就吃到鱼了

猫成精了,想打怪兽

奥特曼.打小怪兽.call(猫,小怪兽)

或者 马云.赚钱.call(我)

还有一位杨志大佬解释的更清楚

我们要先明白存在call和apply的原因,才能记得牢一点:
在javascript OOP中,我们经常会这样定义:
 
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是参数

就这样记住了。

最新文章

  1. Orchard中的命令行工具
  2. 安装zabbix,make的时候报错
  3. EFProf Entity Framework Profile 工具
  4. 【faster-rcnn】训练自己的数据——修改图片格式、类别
  5. pads 扇出
  6. Java 并发编程 Executor
  7. 一行命令实现Android自动关机
  8. Support Facades
  9. http server v0.1_http_parse.c
  10. DataGrid横向滚动条无法拖动的问题
  11. rotate.js实现图片旋转 (chrome,IE,firefox都可以实现)
  12. android TextView 垂直滚动 用动画实现
  13. i美股投资研报--Michael Kors(IPO版) _Michael Kors(KORS) _i美股
  14. Android 开发中常见的注意点
  15. linkin大话设计模式--命令模式
  16. BZOJ 3243 Clever Y
  17. [Sdoi2016]征途
  18. sql 视图学习
  19. 简单的Http请求数据保存到Hdfs
  20. 针对ACM输出格式的一个小技巧(对格式错误说不!)

热门文章

  1. 设计模式系列6:适配器模式(Adapter Pattern)
  2. img transform:scale 放大在ios下变模糊
  3. js中事件冒泡,事件捕获详解
  4. Dynamics CRM项目实例之十:CRM 2015的捆绑销售在订单中的效果
  5. Log4j配置(xml和property两种)
  6. Scrapy 框架流程详解
  7. 城市经纬度 json
  8. FLIR 相机采集程序
  9. C语言中printf,scanf,puts,%%等输出格式
  10. C#中的PropertyGrid绑定对象,通过改变某一值而动态设置部分属性的特性