JavaScript中的arguments,callee,caller

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

arguments:

arguments 该对象代表正在执行的函数和调用它的函数的参数。

[function.]arguments[n]参数

function:选项。当前正在执行的 Function 对象的名字。 

n :选项。要传递给 Function 对象的从0开始的参数值索引。说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments对象。arguments对象只有函数开始时才可用。下边例子详细说明了这些性质://arguments 对象的用法。

function ArgTest(a, b){var i, s = "The ArgTest function expected ";var numargs = arguments.length;     // 获取被传递参数的数值。var expargs = ArgTest.length;       // 获取期望参数的数值。if (expargs < 2)s += expargs + " argument. ";elses += expargs + " arguments. ";if (numargs < 2)s += numargs + " was passed.";elses += numargs + " were passed.";s += " "for (i =0 ; i < numargs; i++){      // 获取参数内容。s += "    Arg " + i + " = " + arguments[i] + " ";}return(s);                          // 返回参数列表。
}

在此添加了一个说明arguments不是数组(Array类)的代码:Array.prototype.selfvalue = 1;

alert(new Array().selfvalue);
function testAguments(){alert(arguments.selfvalue);
}

运行代码你会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1,而当你调用函数testAguments时,你会发现显示的是“undefined”,说明了不是arguments的属性,即arguments并不是一个数组对象。

在此附加上大家推荐的一个简单方法:

alert(arguments instanceof Array);
alert(arguments instanceof Object);

caller:

返回一个对函数的引用,该函数调用了当前函数。

    functionName.caller 

    functionName 对象是所执行函数的名称。

说明

对于函数来说,caller属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本,

注意:Function.toString() 可以实现 Function 的反编译功能.如加上递归功能则功能更加强大

下面的例子说明了 caller 属性的用法:

function callerDemo() {if (callerDemo.caller) {var a= callerDemo.caller.toString();alert(a);} else {alert("this is a top function");}
}
function handleCaller() {callerDemo();
}

callee :

 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。[function.]arguments.callee可选项 function参数是当前正在执行的 Function对象的名称。说明callee属性的初始值就是正被执行的 Function 对象。callee属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名

函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性

仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候

用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是

形参长度,由此可以判断调用时形参长度是否和实参长度一致。示例//callee可以打印其本身

function calleeDemo() {alert(arguments.callee);
}//用于验证参数
function calleeLengthDemo(arg1, arg2) {if (arguments.length==arguments.callee.length) {window.alert("验证形参和实参长度正确!");return;} else {alert("实参长度:" +arguments.length);alert("形参长度: " +arguments.callee.length);}
}
//递归计算
var sum = function(n){if (n <= 0)                        return 1;elsereturn n + arguments.callee(n - 1)
}
//比较一般的递归函数:
var sum = function(n){if (1==n) return 1;else return n + sum (n-1);
}

调用时:alert(sum(100));

其中函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用

一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法。

apply and call :

它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别:      

apply(thisArg,argArray);     

call(thisArg[,arg1,arg2…] ]);

即所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的apply的说明如果 argArray不是一个有效的数组或者不是 arguments对象,那么将导致一个 TypeError。

如果没有提供 argArray和 thisArg任何一个参数,那么 Global 对象将被用作 thisArg, 

并且无法被传递任何参数。call的说明call方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。

如果没有提供 thisArg参数,那么 Global 对象被用作 thisArg相关技巧:应用call和apply还有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的

函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。看下面示例:// 继承的演示

function base() {this.member = " dnnsun_Member";this.method = function() {window.alert(this.member);}
}
function extend() {base.call(this);window.alert(member);window.alert(this.method);
}

上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。顺便提一下,在javascript框架prototype里就使用apply来创建一个定义类的模式,其实现代码如下:

var Class = {create: function() {return function() {this.initialize.apply(this, arguments);}}
}

解析:从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的

构造函数,其中调用initialize,而这个方法是在类创建时定义的初始化函数。通过如此途径,

就可以实现prototype中的类创建模式示例:

var vehicle=Class.create();
vehicle.prototype={initialize:function(type){this.type=type;}showSelf:function(){alert("this vehicle is "+ this.type);}
}
var moto=new vehicle("Moto");
moto.showSelf();

 


转载于:https://my.oschina.net/mayflygeekCarry/blog/364946

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python总结函数图像_PIL使用小结(crop和paste函数)

PIL(Python Imaging Library)是python语言中对图像处理方面的一个开源库&#xff0c;其主要功能模块为Image&#xff0c;对于Image模块&#xff0c;可以使用from PIL import Image或者import Image由于使用了试用版的chartdir库&#xff0c;在生成图片的时候下面会出现一行提示…

js中apply和join

join 分隔符分隔指定数组中的数据,不仅可以分割&#xff0c;还可以考虑用join("")合并&#xff0c;可以将一个array对象数据进行合并 1 <script>2 vark["2","3",4,5];3 alert(k.join(""));4 vars["s",":",,…

12333新农合网上查询_新农合医保查询缴费平台|新农村医疗保险网上缴费平台

这个智慧新农合新农合患者就诊从挂号到缴费&#xff0c;不用再拿着各种票据在报销处和收费处之间奔走&#xff0c;也不用担心票据不完整造成无法正常报销的情况&#xff0c;只需携带本人有效身份证和农合本&#xff0c;凭身份证号码或新农合号码即可实时报销所有费用&#xff0…

晚上我们一起去白码会所玩啊!

1 白学公主和白码王子真般配晚上一起去白码会所玩啊▼2 看完这些图我觉得要重新考虑要不要让男人陪产了▼3 乒乓球拍好难吃啊▼4 论朋友圈美食照片是怎么来的▼5 论推广普通话的重要性▼6 关键是&#xff0c;你吃完一身味忘不掉而且大多数人吃一次还想吃▼7 想知道一天1…

System.Linq捉虫记 | 论变量命名的重要性

前言下面这段代码&#xff0c;你能发现什么问题吗&#xff1f;List<int> a new List<int>{ 1, 2, 3, 4, 5 };var last2 a.TakeLast(2);foreach (var item in last2) { Console.WriteLine(item); }a.AddRange(new[] { 11, 12, 13, 14, 15 });foreach (var item in…

ASP.NET的SEO:HTTP报头状态码---内容重定向

本系列目录 我们经常说“404错误”&#xff0c;你知道他指的是什么意思么&#xff1f; 404其实是Http报头所包含的一个“状态码”&#xff0c;表明该Http请求失败。那么除此之外&#xff0c;还有哪些常用的状态码呢&#xff1f;这些状态码和SEO又有什么关系呢&#xff1f;每次当…

java 双向链表_java集合类之LinkedList

LinkedList简介LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口&#xff0c;能对它进行队列操作。LinkedList 实现 Deque 接口&#xff0c;即能将LinkedList当作双端队列使用。LinkedList 实…

疯狂福利 | 美剧《天赋异禀》1-2季免费送!播放超12亿!刷了整整一晚上,太上头!...

全世界只有3.14 % 的人关注了爆炸吧知识蹬&#xff0c;蹬&#xff0c;蹬&#xff01;爆炸吧知识的好朋友【知英语】来撒福利啦……超火美剧《天赋异禀》1-2季&#xff0c;一次性打包免费送给你喽&#xff01;注意在“知英语”公众号回复【天赋】即可获取&#xff0c;记得收好哦…

.Net之SoapCore简单使用

最近在工作中&#xff0c;需要同时放出来WebAPI接口和支持Soap协议的WebService接口&#xff0c;在dotNetFramework时候玩过WebService&#xff0c;这可是好久没再碰过了&#xff0c;没想到现在居然遇到了。只好迎难而上。介绍本来是在ASP.NetCore中使用了组件SoapCore来使用So…

Word打不开,如何修复word文档?

2019独角兽企业重金招聘Python工程师标准>>> 亲爱的你有没有遇到过写了好久的一篇文档突然打不开的惨剧&#xff1f;有没有为一篇重要的文件被损坏而苦恼几天的情形&#xff1f;遇到这种情况怎么办&#xff1f;不要急&#xff0c;不要急&#xff01;我将会给你带来一…

面试了57位数据分析师,我发现牛逼的人都有这4个特质

全世界只有3.14 % 的人关注了爆炸吧知识现在的职场竞争越来越激烈&#xff0c;不学上一两门新技能&#xff0c;保持自己知识更新&#xff0c;很容易被年轻后辈超越。有些人选择学一门外语&#xff0c;有些人选择学习职场上为人处事的能力。如果你的工作需要和数据打交道&#x…

iNeuOS工业互联网,增加一批PLC、核工业、数字模块、传感器等设备驱动

增加流量计、AI/AO/DI/DO模块、质谱、色谱、加热炉及其他行业专用设备等&#xff0c;不同的通讯协议和通讯机制整体集成到iNeuOS系统中。数据采集&#xff0c;涉及到领域的专业设备、通用设备和PLC&#xff0c;有国内传感器和国外传感器&#xff0c;通讯协议和数据格式多种多样…

SpringMVC异常处理流程

2019独角兽企业重金招聘Python工程师标准>>> Controller中的方法执行出现异常ex.ex在DispatchServlet中被捕获,交给默认的ExceptionHandlerExceptionResolver进行处理.ExceptionHandlerExceptionResolver先在Controller中找标有ExceptionHandler的方法.没有找到. go…

为什么盯一个字看久了,反而感觉不认识了?

全世界只有3.14 % 的人关注了爆炸吧知识你肯定有过这样一种体验——长时间盯着某个字看&#xff0c;或者重复写一个字&#xff0c;就会觉得这个字越写越不认识想想你被老师罚抄作业的时候……盯着这张图看1分钟▼你是不是就不认识“哈”了神经活动被你“玩累”了盯着一个字看久…

自建PicGo图床

介绍图床工具&#xff0c;就是自动把本地图片转成连接的一款工具&#xff0c;网络上有很多图床工具&#xff0c;PicGo就是一款比较优秀的图床工具&#xff0c;可以支持微博&#xff0c;七牛云&#xff0c;腾讯云COS&#xff0c;又拍云&#xff0c;GitHub&#xff0c;阿里云OSS&…

【心情】今天买了ZÈRTZ!

转载于:https://www.cnblogs.com/boringlamb/archive/2010/04/27/1721772.html

当代人的恋爱步骤

1 耳朵连线了&#xff1f;2 有时候我们更需要做一个稳重的吃货3 你大爷果然是你大爷… 4 我竟然下意识的吹了一口5 这也太孤独了6 当代人的恋爱步骤7 据说这张图上有10个人&#xff0c;你能找到几个&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

使用EF Core操作层次结构数据

前言以前我们存储层次结构常用IdParentId的方式&#xff0c;例如&#xff1a;IdParentIdName1null总公司21分公司131分公司242部门A54小组X64小组Y这种方式查询效率不高&#xff0c;比如查询分公司1下的所有小组&#xff0c;必须使用递归。针对这个问题&#xff0c;如果你是使用…

仿UC菜单的实现

http://blog.csdn.net/hellogv/archive/2011/01/28/6168439.aspx &#xff08;另&#xff09;http://www.cnblogs.com/lichien/archive/2010/09/07/1820453.html 先来看看本文程序运行的效果&#xff1a; TabMenu 本身就是一个PopupWindow&#xff0c;PopupWindow上面放了两个G…

选了combobox里的选项后没激发change事件_stata 事件分析法

前言&#xff1a;因为一些原因&#xff0c;国庆节期间学的。学习过程很酸爽&#xff0c;自己并没有很多统计学及其相关软件的经验&#xff0c;网上相关资料也不是很多。我在微信公众号、知网、经管之家、B站、百度文库等很多平台找了各式的资料来学&#xff08;花了70大洋去买代…