Arguments
该对象代表正在执行的函数和调用他的函数的参数。
[function.]arguments[n]
参数function :选项。当前正在执行的 Function 对象的名字。 n :选项。要传递给 Function 对象的从0开始的参数值索引。
Arguments对象只在函数体中定义。虽然技术上说来,它不是数组,但Arguments对象有带编号的属性,这些属性可以作为数组元素,而且它有 length属性,该属性声明了数组元素的个数。它的元素是作为参数传递给函数的值。元素0是每一个参数,元素1是第二个参数,以此类推。所有作为参数传递的值都会成为Arguments对象的数组元素,无论函数声明中是否有这些参数的名称。
说明
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. ";
else
s += expargs + " arguments. ";
if (numargs < 2)
s += numargs + " was passed.";
else
s += numargs + " were passed.";
s += "\n\n"
for (i =0 ; i < numargs; i++){ // 获取参数内容。
s += " Arg " + i + " = " + arguments[i] + "\n";
}
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并不是个数组对象。
caller
返回一个对函数的引用,该函数调用了当前函数。
functionName.caller
functionName 对象是所执行函数的名称。
说明
对于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 相同,也就是说,显示的是函数的反编译文本。
下面的例子说明了 caller 属性的用法:
// caller demo {
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;
else
return 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();
更周详的关于prototype信息请到其官方网站查看。
分享到:
相关推荐
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...
"arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...
twostar(1, 2, 3) # TypeError: twostar() takes 0 positional arguments but 3 were given ``` #### 四、综合应用 Python 允许在同一函数定义中同时使用这三种参数类型。这样可以创建功能更强大的函数,能够灵活...
理解Javascript函数形式参数与arguments 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...
标题 "解析 this.initialize.apply(this, arguments)" 涉及到的是JavaScript编程中的一个关键概念,尤其是在对象构造和类继承的情景下。`this` 关键字在JavaScript中扮演着核心角色,它指的是函数调用时的上下文,而...
《A Rulebook for Arguments》(《论证的规则手册》)是由Anthony Weston所著的关于逻辑论证、辩论和批判性思维的指南书籍,此书自1987年首次出版以来,一直广受好评,并已更新至第三版。本书不仅适用于学术界,同样...
### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...
Rethinking the design of the Internet:The end to end arguments vs. the brave new world 作者:Marjory S. Blumenthal, Computer Science & Telecommunications Bd David D. Clark, M.I.T. Lab for Computer ...
描述中提到的 "ORA-00600: INTERNAL ERROR CODE, ARGUMENTS: [17059], [0X93953434]" 是一个Oracle数据库内部错误代码,表示遇到了无法处理的系统级异常。ORA-00600错误通常涉及到数据库的内部一致性问题,这可能是...
在JavaScript编程语言中,函数是核心的组成部分,而`Arguments`对象则是JavaScript函数的一个独特特性。这个对象在函数调用时被自动创建,用于存储所有传递给函数的实际参数,无论这些参数是否在函数声明中定义。`...
在iOS开发中,Variadic Arguments(可变参数)是一种允许函数接受不同数量参数的技术。它在C、C++和Objective-C等语言中被广泛使用,包括iPhone应用开发。本实例将深入探讨如何在Objective-C中使用Variadic ...
Arguments对象是JavaScript中一个特殊的数据结构,主要用于在函数内部存储传递给函数的所有参数。无论函数定义了多少个参数,Arguments对象都会包含所有实际传递的参数。这篇深度研究主要探讨了Arguments对象的几个...
首先,理解"Function input arguments always precede output arguments"这一原则。在函数定义时,通常按照以下顺序安排参数:先输入参数,后输出参数。输入参数(也称为形参)是函数执行任务所需的外部数据,它们在...
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,尤其在处理函数参数时。它不是一个数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径,无论这些参数是否在函数定义中声明。`...
《端到端设计在系统架构中的应用》一文由J.H. Saltzer、D.P. Reed和D.D. Clark撰写,出自麻省理工学院计算机科学实验室。本文旨在探讨分布式计算机系统中功能模块放置的设计原则,重点阐述了一种被称为“端到端”...
JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...
标题“arguments-read-and-assignment.rar_assignment”提示我们这个压缩包可能包含有关JavaScript编程中的“arguments”对象和赋值操作的资料。在JavaScript中,“arguments”对象是一个特殊的对象,它在函数内部...
JavaScript中的隐含参数`arguments`, `callee`, 和 `caller`是函数内部的特殊变量,它们提供了关于函数调用的重要信息。下面将详细解释这三个参数的使用方法。 **arguments对象** `arguments`对象是一个非常有用的...
NULL 博文链接:https://gembler.iteye.com/blog/346242
在JavaScript中,arguments、caller、callee和apply是四个与函数调用相关的特性,它们在编写高级和复杂的函数逻辑时非常有用。下面将详细介绍这些概念及其用法。 1. **arguments对象** arguments对象是一个特殊...