真的是非常简单的理解,我知道的并不多,在网上查找了很多的资料,还是只能了解一点皮毛,下面来整理出来,方便以后深入的去学习,也是对目前知道的知识点的巩固。

整理一些网上的经典解答:

1.一句话区分call 和apply

obj1.call(obj2,arg1,arg2,arg3) == obj1.apply(obj2,arguments) == obj2.foo(arg1,arg2,arg3)

thisA.functionA.apply(thisB,[arg1,arg2,...]) == thisA.functionA.call(thisB,arg1,arg2,...) == thisB.functionA(arg1,arg2,...)

  • obj2如果为空则this指向window对象
  • call 和apply的区别在于:call接的参数是固定的,按照顺序输入。apply接收的参数是一个数组。
  • 什么时候使用call或者apply?当参数是固定的时候一般使用call,如果参数不确定或者参数是一个数组时需要使用apply.
  • 上面的话理解成 obj2调用obj1的方法。对象thisB调用thisA的functionA方法

2.理解obj2如果为空则this指向window

 obj1.call(obj2,a,b);
//等价于
if(obj2!==null){
obj1.this=obj2;
}else{
obj1.this=window;
}
obj1(a,b);

3.摘自javascript高级程序书本中的代码

 var values = [1,2,3,4,5,6,9];
var max = Math.max.apply(Math,values);
console.log(max);//

这里Math当作apply()的第一个参数我无法理解,max()方法是Math对象下面的一个方法,values为一个数组对象,需要去借用Math对象下面的max()方法。

 var values = [1,2,3,4,5,6,9];
var max = Math.max.apply(Array,values);
console.log(max);//
 var values = [1,2,3,4,5,6,9];
var max = Math.max.apply(this,values);
console.log(max);//

发现用Array或者this代替 Math尽然都会输出9.

4.一个例子

call和apply可以用来重新定义函数的执行环境,也就是this的指向

 function changgeStyle(attr,value){
this.style[attr] = value;
}
var box = document.getElementById("box");
window.changgeStyle.call(box,"height","200px");

changgeStyle()为window对象下面的方法,那么如何把window对象的方法转移到box对象上呢,通过动态的改变this的指向,也就是相当于借用window.changgeStyle()的方法,通过call方法把 window.changgeStyle("height","200px")变成了box.changgeStyle("height","200px").

总结:就是自己没有的属性或者方法,通过改变函数的执行环境(this的指向),或者通俗点来说就是借用别人的属性或者方法来执行操作。

对call() apply() 方法的简单理解的更多相关文章

  1. javascript中apply()方法解析-简单易懂!

    今天看到了js的call与apply的异同,想着整理一下知识点,发现了一篇好文章,分享过来给大家,写的非常好! 参考: http://www.cnblogs.com/delin/archive/201 ...

  2. 关于JS中apply方法的基本理解

    最近研究OpenLayers源码时,发现其中使用了比较多的apply方法,对其也是很不明白.于是上网经过多方面了解以及自己细细体会后,终于算是基本明白是其干什么的了,这里分享下.apply方法的造型是 ...

  3. interrupt()方法的简单理解

    interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程.这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态.更确切的说,如果线程被Objec ...

  4. 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]

    转载自:http://gxxsite.com/content/view/id/132.html 在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore ...

  5. 理解JavaScript中的call和apply方法

    call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...

  6. JS中的call()和apply()方法理解和使用

    1.方法定义call方法: 语法:obj.method.call(thisObj[,arg1[, arg2[, [,.argN]]]]) 定义:调用对象(obj)的一个方法(method),以另一个对 ...

  7. 简单理解Javascript中的call 和 apply

    javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...

  8. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  9. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

随机推荐

  1. OTS parsing error: invalid version tag woff和ttf文件被Filter拦截

    从服务器下载的字体文件放在本地,执行无法展示iconfont,浏览器控制台报出 Failed to decode downloaded font: http://127.0.0.1:8080/mhr/ ...

  2. 使用sqldeveloper连接服务器端数据库

  3. mongodb基础学习8-复制集

    今天来简单学习一下复制集(replication),什么是复制集呢,类似于mysql的主从复制吧 简单来说就是有多个mongodb的实例,多个实例有相同的内容,其中一台用于读写,其它用于备份,当用于读 ...

  4. java 注解 基本原理 编程实现

    摘要: java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说,反射的定义应该包含注解才合理一些. java 1.5开始 ...

  5. javascript,排列组合

    输入参数 ‘abc',输出所有组合 ['abc','acb','bac','bca','cab','cba'] 思路:分为3列,第一列为  a, b,c :第二列为a,b,c出去第一列选中过后的,比如 ...

  6. 利用css和javascript实现简单的计算器

    <!doctype html> <html> <head> <!--声明当前页面的编码集--> <meta http-equiv="Co ...

  7. QT隐式数据共享

    QT中许多C++类使用了隐式数据共享,最小化资源拷贝.当作为参数传递时,实际只传递了指针,这是底层完成的,程序员无需担心,即使是在多线程中,从Qt4开始: 记住,尽量使用const迭代器,vector ...

  8. python之列表【list】

    这里介绍下列表的功能 #切片:列表[a:b],从下标为a开始,到下标为(b-1)的元素 # name = [0,1,2,3,4,5,6,7,8,9] # print(name[1:6]) # # 结果 ...

  9. word2003设置页码不从第一页开始的方法

    问题描述:如果你想设置页码从第三四页开始,前边不要页码,或者前边的页码是不同类型的.那么这个时候就要用到:插入->分隔符模式. 如果你的页面中的各个标题是从样式和格式中选择的,既是你先设置好各种 ...

  10. NSThread 在主线操作的三个方法

    - (void)createNSThread444{ UIImage *image = [UIImage imageNamed:@"图片名字"]; /** 1 performSel ...