要理解javascript中间apply和call
apply和call它是javascript一个非常重要的方法,。虽然与程序平时很少接触,但JS到处都在使用这个框架2方法。
2个方法是在Function.prototype中。也就是说每一个JS函数都有这2个方法。
alert(Function.prototype.hasOwnProperty("apply"));//true
alert(Object.prototype.hasOwnProperty("apply"));//false
这2个函数完毕的功能是等价的。唯一的区别在于參数形式不同。
function Person(name,age)
{
alert("name=" + name +",age="+age);
} Person.call({},"aty",10);
Person.apply({},["aty",10]);
方法的具体介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function
java中通过反射调用方法的代码例如以下:
Method method = clazz.getDeclaredMethod("say");
method.invoke(clazz.newInstance(),null);
能够看到:java反射方法调用与apply/call是非常相似的。Person相当于method,代表着调用什么方法。{}和clazz.newInstance()相似,代表调用哪个对象(即方法中的this),最后面是方法须要的參数列表。
我们知道在java中thiskeyword代表当前对象,我们无法改动。javascript中直接调用函数,跟java函数调用一样,this就代表当前对象。
假设想改动this。那么能够使用apply这样的方式。
aobj.afunction("1");
aobj.afunction.apply(bobj,["1"]);
第一种方式,函数中的this就是aobj,这是我们比較熟悉的做法;另外一种方式。函数中的this是bobj。
通过apply。对象bobj能够使用aobj中定义的方法。
function FunctionA(name)
{
this.name=name;
} function FunctionB(name,age)
{ FunctionA.apply(this,arguments);
this.age=age;
} var bObj = new FunctionB("qq",11);
使用F12调试工具能够发现:bObj对象中有name和age属性。
版权声明:本文博主原创文章,博客,未经同意不得转载。
要理解javascript中间apply和call的更多相关文章
- 理解 JavaScript call()/apply()/bind()
理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然 ...
- 再次理解javascript的apply
普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,ja ...
- javascript中apply、call和bind的区别,容量理解,值得转!
a) javascript中apply.call和bind的区别:http://www.cnblogs.com/cosiray/p/4512969.html b) 深入浅出 妙用Javascrip ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- 关于javascript中apply()和call()方法的区别
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...
- 深入理解javascript原型和闭包(6)——继承
为何用“继承”为标题,而不用“原型链”? 原型链如果解释清楚了很容易理解,不会与常用的java/C#产生混淆.而“继承”确实常用面向对象语言中最基本的概念,但是java中的继承与javascript中 ...
- 深入理解javascript原型和闭包(10)——this
接着上一节讲的话,应该轮到“执行上下文栈”了,但是这里不得不插入一节,把this说一下.因为this很重要,js的面试题如果不出几个与this有关的,那出题者都不合格. 其实,this的取值,分四种情 ...
- 图说js中的this——深入理解javascript中this指针
没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html ...
- (转)深入浅出 妙用Javascript中apply、call、bind
原文连接 深入浅出 妙用Javascript中apply.call.bind 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且 ...
随机推荐
- Unity 3D 动画帧事件
前几天在项目开发中碰到一个这样的需求,RPG游戏中,特效和动画播放不同步的.假如主角在攻击NPC时,先实例化特效,后播放动画.动画毕竟是有一个时间长度的.等到动画播放攻击挥刀的那一瞬间时,特效可能早就 ...
- VCS仿真 Dump Memory
VCS仿真 Dump Memory 两种方法 vcs联合verdi生成fsdb文件 vcs生成vpd文件 VCS联合verdi生成fsdb文件 1.testbench中加入如下语句: initial ...
- 命令行下如何安装VMware Tools并与windows资料共享
安装VMware Tools: 选择菜单栏“虚拟机”——“安装VMware tools” ,等待系统自动更换ISO光盘 mount /dev/cdrom /mntcd /mnttar zxvf VMw ...
- JQuery.ajax一解
关于JQuery.ajax方法,好处也不用多说了,主要是想记下ajax中的一些参数: url:请求的目标地址,为一个字符串,格式为:http://localhost:端口号/User/方法名.eg:现 ...
- silverlight .net后台 设置visifire控件图表样式 属性说明
.net后台 代码: 如图 Chart chart = new MyCharts(); //图表 //chart.Watermark = false; //没好使 ...
- UIView设置少于四个的圆角
最近的需求中有个label需要设置右下角为圆角,其余三个为直角,一开始用的是重写drawRect,然后用绘图重绘每个角的样子,计算起来还是麻烦 后来发现了下面的方法: UILabel *courseS ...
- cell的各种使用和赋值 总结
cell可以分为:自定义cell,系统的cell ,cell的自适应,.xib的cell //第一种cell:系统cell 在 UIViewController下创建UITableView //1.0 ...
- [QT]QT概述
QT概述 基于C++的GUI开发框架,跨平台.Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架. QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名:他的宗旨是“一次 ...
- 初学 Play Framework 以及可能遇到的问题
这段话之后都是我从别人那拷贝过来的资料,方便大家查阅 红色标注字体是我自己遇到的一些问题: 如果你遇到了这样的问题 :
- R语言画正弦曲线
正弦曲线一个周期是2π,我们要先生成x的取值范围. 可以用seq函数生成一个等差序列,步进为0.01 x=seq( 0, 2*pi, 0.01 ) pi表示π y=sin(x) plot(x, ...