- 浏览: 624788 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享.. 如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高..
主要我是要解决一下几个问题:
1. apply和call的区别在哪里
2. 什么情况下用apply,什么情况下用call
3. apply的其他巧妙用法(一般在什么情况下可以使用apply)
我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用.
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)
call:和apply的意思一样,只不过是参数列表不一样.
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表
1. apply示例:
分析: Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是[“qian”,”21”,”一年级”];
也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面
2. call示例
在Studen函数里面可以将apply中修改成如下:
Person.call(this,name,age);
这样就ok了
3. 什么情况下用apply,什么情况下用call
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));
4. apply的一些其他巧妙用法
细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:
a) Math.max 可以实现得到数组中最大的一项
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去
b) Math.min 可以实现得到数组中最小的一项
同样和 max是一个思想 var min=Math.min.apply(null,array);
c) Array.prototype.push 可以实现两个数组合并
同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:
1 vararr1=new Array("1","2","3");
2
3 vararr2=new Array("4","5","6");
4
5 Array.prototype.push.apply(arr1,arr2);
也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.
通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:
一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!
5. 总结:
一开始我对apply 非常的不懂,最后多看了几遍,自己多敲了几遍代码,才明白了中间的道理,所以,不管做什么事情,只要自己肯动脑子,肯动手敲代码,这样一个技术就会掌握…
还有比如第四部分得内容,巧妙的解决了实实在在存在的问题,这个肯定不是一个初学者能想到的解决方案(这个也不是我自己想的),没有对编程有一定认识的不会想到这个的,还是一句话,多积累,多学习,提升自己的能力和对编程思想的理解能力才是最关键!
其中有大部分内容参考自:
http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html
转自:http://www.cnblogs.com/KeenLeung/archive/2012/11/19/2778229.html
参考:http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html
主要我是要解决一下几个问题:
1. apply和call的区别在哪里
2. 什么情况下用apply,什么情况下用call
3. apply的其他巧妙用法(一般在什么情况下可以使用apply)
我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用.
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)
call:和apply的意思一样,只不过是参数列表不一样.
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表
1. apply示例:
1 <script type="text/javascript"> 2 /*定义一个人类*/ 3 function Person(name,age) 4 { 5 this.name=name; 6 this.age=age; 7 } 8 /*定义一个学生类*/ 9 function Student(name,age,grade) 10 { 11 Person.apply(this,arguments); 12 this.grade=grade; 13 } 14 //创建一个学生类 15 var student=new Student("qian",21,"一年级"); 16 //测试 17 alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade); 18 //大家可以看到测试结果name:qian age:21 grade:一年级 19 //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处. 20 </script>
分析: Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是[“qian”,”21”,”一年级”];
也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面
2. call示例
在Studen函数里面可以将apply中修改成如下:
Person.call(this,name,age);
这样就ok了
3. 什么情况下用apply,什么情况下用call
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));
4. apply的一些其他巧妙用法
细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:
a) Math.max 可以实现得到数组中最大的一项
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去
b) Math.min 可以实现得到数组中最小的一项
同样和 max是一个思想 var min=Math.min.apply(null,array);
c) Array.prototype.push 可以实现两个数组合并
同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:
1 vararr1=new Array("1","2","3");
2
3 vararr2=new Array("4","5","6");
4
5 Array.prototype.push.apply(arr1,arr2);
也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.
通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:
一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!
5. 总结:
一开始我对apply 非常的不懂,最后多看了几遍,自己多敲了几遍代码,才明白了中间的道理,所以,不管做什么事情,只要自己肯动脑子,肯动手敲代码,这样一个技术就会掌握…
还有比如第四部分得内容,巧妙的解决了实实在在存在的问题,这个肯定不是一个初学者能想到的解决方案(这个也不是我自己想的),没有对编程有一定认识的不会想到这个的,还是一句话,多积累,多学习,提升自己的能力和对编程思想的理解能力才是最关键!
其中有大部分内容参考自:
http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html
转自:http://www.cnblogs.com/KeenLeung/archive/2012/11/19/2778229.html
参考:http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html
发表评论
-
解决 CSDN 登录后才能复制的功能
2022-01-10 18:02 1034javascript:document.body.conten ... -
Flutter和RN对比
2021-10-22 11:33 399Flutter和RN对比 Flutter介绍和主流框架的对比 ... -
window.opener引用为null的解决办法
2021-03-14 14:15 2062http://www.bubuko.com/infodetai ... -
layui select下拉框改变之 change 监听事件
2019-04-10 10:21 894https://blog.csdn.net/weixin_36 ... -
如何和何时使用CSS的!important
2019-04-09 20:45 356https://www.w3cplus.com/css/the ... -
<iframe>标签自适应高度和宽度
2018-04-22 13:06 387引用 <iframe src="index.h ... -
jMessageBox
2017-04-23 16:35 395http://www.thinksaas.cn/topics/ ... -
ajax跨域访问
2017-03-13 07:29 575No 'Access-Control-Allow-Origin ... -
完美Email验证正则表达式
2016-10-12 10:17 834际域名格式如下: 域名由各国文字的特定字符集、英文字母、数字 ... -
browserWindows.js
2016-10-10 09:28 118/****************************** ... -
KO框架
2016-09-19 08:54 982http://knockoutjs.com/documenta ... -
Ajax 请求的http头信息特点 x-requested-with
2016-08-08 09:14 4200很多用到AJAX请求,如何区别一个请求是传统的HTTP请求?还 ... -
js如何监听用户的刷新操作
2016-08-04 11:18 972只监听用户用F5刷新 检测F5的keypress keydow ... -
js两种定义函数、继承方式及区别
2016-07-12 10:11 501一:js两种定义函数的方式及区别 1:函数声明: funct ... -
表单校验组件ValidForm 一
2016-07-06 09:43 175010.表单校验组件ValidForm 10.1使用入门 1、引 ... -
表单校验组件ValidForm 二
2016-07-06 09:38 118310.4Validform对象[方法支 ... -
JS中的!=、== 、!==、===的用法和区别
2016-07-06 08:59 372var num = 1; var str = '1'; ... -
javascript记住用户名和登录密码(两种方式)
2016-07-06 08:53 3250下面主要通过代码给大 ... -
window.returnValue的用法
2016-07-04 10:27 468returnValue是javascript中html的win ... -
正则表达式验证中文
2016-06-13 15:24 810在实际开发过程中,我们可能经常会遇到需要判断一个字符是否是汉字 ...
相关推荐
在“JavaScript动态网页开发详解——JavaScript特效”这一主题中,我们将深入探讨JavaScript如何实现各种炫酷的网页效果。 一、JavaScript基础 在讨论特效之前,我们需要了解JavaScript的基础。JavaScript语法与...
JavaScript凌厉开发——Ext详解与实践 源码 源代码 part3 因为源代码比较大,压缩后76M左右 所以分为四个包上传
深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手 深入理解JavaScript系列(24):JavaScript与DOM(下) 深入理解JavaScript系列(25):设计模式之单例模式 深入理解JavaScript系列(26)...
通过以上知识点的梳理,我们可以看到《JavaScript权威指南》第6版涵盖了从基础语法到高级特性的全面内容,对于希望深入了解JavaScript及其在Web开发中应用的学习者来说,是一本不可或缺的参考书籍。无论是初学者还是...
### 一种更智能的学习JavaScript的方法(2013年版) #### 一、概述 《一种更智能的学习JavaScript的方法》是一本由马克·迈尔斯(Mark Myers)在2013年出版的书籍,该书旨在通过现代技术手段来帮助读者更加高效地...
全书配套5个视频课件 0 编程起步之Hello_World程序 2 JavaScript事件处理 3 JavaScript基于对象编程 4 JavaScript资源访问安全性 5 JavaScript脚本与Flash进行通信
目前为止可以说是公认的最好的javascript教材,从入门到深入,十分经典。这本书网上可以说很少有中文版下载的。分两部分
这篇教程——"JavaScript学习手册十四:HTML DOM-文档元素的操作(二)"深入探讨了如何使用JavaScript来操纵HTML文档中的元素,进一步提升网页动态性和交互性。 DOM是HTML和XML文档的一种结构化表示,它将网页内容...
读书笔记:剑指Offer——名企面试官精讲典型编程题 Javascript版本
在标题“学习资源——JavaScript”与描述“点点滴滴,记录JavaScript的开头引用的应用”中,我们可以理解到这份文档旨在分享JavaScript的一些基本应用实例,特别是关于如何引入(import)或链接(link)外部资源。...
张孝祥老师的“JavaScript网页开发——体验式学习教程”深入浅出地涵盖了JavaScript的基础与高级知识,旨在帮助学习者通过实践掌握这一强大的工具。 首先,教程中会涉及HTML(HyperText Markup Language)和CSS...
深入理解JavaScript系列(20):《你真懂JavaScript吗 》答案详解 深入理解JavaScript系列(21):S O L I D五大原则之接口隔离原则ISP 深入理解JavaScript系列(22):S O L I D五大原则之依赖倒置原则DIP 深入...
这份"JavaScript网页开发——体验式学习教程.pdf"提供了一个深入理解JavaScript语法和实践的平台,帮助初学者和有一定基础的开发者提升技能。 教程首先会介绍JavaScript的基础知识,包括变量、数据类型(如字符串、...
JavaScript凌厉开发——Ext详解与实践 源码 源代码 part4 因为源代码比较大,压缩后76M左右 所以分为四个包上传
apply方法的语法是:apply([thisObj[, argArray]])。其中,thisObj是要改变的对象,argArray是一个数组,里面包含要传递给函数的参数。如果没有提供thisObj参数,那么Global对象被用作thisObj。例如: ```...
通过深入学习这三门语言,你不仅可以创建静态网页,还能实现动态交互的效果,为用户提供更丰富的体验。此外,随着Web技术的不断发展,了解和掌握前端框架,如React、Vue或Angular,将使你在网页设计与开发领域更具...
NULL 博文链接:https://jiangzhengjun.iteye.com/blog/463038
从给定的文件信息来看,这是一本关于JavaScript编程的权威指南——《JavaScript:缺失的手册》,由David Sawyer McFarland编写,版权日期为2008年,由O'Reilly Media出版。这本书旨在填补JavaScript学习者在入门时...