对call() apply() 方法的简单理解
真的是非常简单的理解,我知道的并不多,在网上查找了很多的资料,还是只能了解一点皮毛,下面来整理出来,方便以后深入的去学习,也是对目前知道的知识点的巩固。
整理一些网上的经典解答:
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() 方法的简单理解的更多相关文章
- javascript中apply()方法解析-简单易懂!
今天看到了js的call与apply的异同,想着整理一下知识点,发现了一篇好文章,分享过来给大家,写的非常好! 参考: http://www.cnblogs.com/delin/archive/201 ...
- 关于JS中apply方法的基本理解
最近研究OpenLayers源码时,发现其中使用了比较多的apply方法,对其也是很不明白.于是上网经过多方面了解以及自己细细体会后,终于算是基本明白是其干什么的了,这里分享下.apply方法的造型是 ...
- interrupt()方法的简单理解
interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程.这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态.更确切的说,如果线程被Objec ...
- 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]
转载自:http://gxxsite.com/content/view/id/132.html 在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore ...
- 理解JavaScript中的call和apply方法
call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...
- JS中的call()和apply()方法理解和使用
1.方法定义call方法: 语法:obj.method.call(thisObj[,arg1[, arg2[, [,.argN]]]]) 定义:调用对象(obj)的一个方法(method),以另一个对 ...
- 简单理解Javascript中的call 和 apply
javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...
随机推荐
- Oracle免客户端InstantClient安装使用
正常情况下,用PL/SQL等软件连接Oracle,需要安装Oracle客户端软件,一般安装oracle客户端差不多需要2G左右的硬盘空间,但如果我们仅仅是连接数据库进行查询和执行一些相应的语句而不进行 ...
- mysql 数值与字符类型 长度梳理
上述表格中的数值类型都是定长的,也就是说,无论你存的数值是多少,多大或者多小,占用的存储字节大小都是固定的.例如,设置int(1),虽然M值是1个字符,但是它所占用的空间大小永远都是4个字节的大小,换 ...
- Linux 软件 安装到 /usr,/usr/local/ 还是 /opt 目录
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...
- sqlserver批量导出存储过程、函数、视图
select text from syscomments s1 join sysobjects s2 on s1.id=s2.id where xtype = 'V' xtype V 视图 P ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
- centos7下编译安装php-7.0.15(PHP-FPM)
centos7下编译安装php-7.0.15(PHP-FPM) 一.下载php7源码包 http://php.net/downloads.php 如:php-7.0.15.tar.gz 二.安装所需依 ...
- 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...
- [PHP] constant variable
print: 3.13 PI 3.14
- pip安装python模块方法
网上搜索了很多,主流的配置方法分为两种: 摘自 1.http://www.jb51.net/article/83617.htm 安装pip的包并确定pip安装时的镜像源地址,国内常用的地址有: htt ...
- 调用数据库-corina
pym = mysql(host='#####', port=3306, user='######', password='########', database='algorithm') #查询数据 ...