`

arguments

阅读更多
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信息请到其官方网站查看。
分享到:
评论

相关推荐

    arguments对象的使用

    在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...

    前端开源库-arguments-extended

    "arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...

    Passing arguments to Python functions

    twostar(1, 2, 3) # TypeError: twostar() takes 0 positional arguments but 3 were given ``` #### 四、综合应用 Python 允许在同一函数定义中同时使用这三种参数类型。这样可以创建功能更强大的函数,能够灵活...

    理解Javascript函数形式参数与arguments

    理解Javascript函数形式参数与arguments 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...

    解析 this.initialize.apply(this, arguments)

    标题 "解析 this.initialize.apply(this, arguments)" 涉及到的是JavaScript编程中的一个关键概念,尤其是在对象构造和类继承的情景下。`this` 关键字在JavaScript中扮演着核心角色,它指的是函数调用时的上下文,而...

    A Rulebook for Arguments

    《A Rulebook for Arguments》(《论证的规则手册》)是由Anthony Weston所著的关于逻辑论证、辩论和批判性思维的指南书籍,此书自1987年首次出版以来,一直广受好评,并已更新至第三版。本书不仅适用于学术界,同样...

    JS:arguments

    ### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...

    Rethinking the design of the Internet:The end to end arguments vs. the brave new world

    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 ...

    p8922013_10204_Linux-x86-64.zipORA-00600: INTERNAL ERROR CODE, ARGUMENTS: [17059

    描述中提到的 "ORA-00600: INTERNAL ERROR CODE, ARGUMENTS: [17059], [0X93953434]" 是一个Oracle数据库内部错误代码,表示遇到了无法处理的系统级异常。ORA-00600错误通常涉及到数据库的内部一致性问题,这可能是...

    Arguments是进行函数调用.doc

    在JavaScript编程语言中,函数是核心的组成部分,而`Arguments`对象则是JavaScript函数的一个独特特性。这个对象在函数调用时被自动创建,用于存储所有传递给函数的实际参数,无论这些参数是否在函数声明中定义。`...

    iphone开发实例 04-Variadic Arguments

    在iOS开发中,Variadic Arguments(可变参数)是一种允许函数接受不同数量参数的技术。它在C、C++和Objective-C等语言中被广泛使用,包括iPhone应用开发。本实例将深入探讨如何在Objective-C中使用Variadic ...

    Arguments对象作用深度研究.pdf

    Arguments对象是JavaScript中一个特殊的数据结构,主要用于在函数内部存储传递给函数的所有参数。无论函数定义了多少个参数,Arguments对象都会包含所有实际传递的参数。这篇深度研究主要探讨了Arguments对象的几个...

    Handler Function input arguments

    首先,理解"Function input arguments always precede output arguments"这一原则。在函数定义时,通常按照以下顺序安排参数:先输入参数,后输出参数。输入参数(也称为形参)是函数执行任务所需的外部数据,它们在...

    js中arguments的用法(实例讲解).docx

    在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,尤其在处理函数参数时。它不是一个数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径,无论这些参数是否在函数定义中声明。`...

    End-to-End Arguments in System Design(端到端设计)

    《端到端设计在系统架构中的应用》一文由J.H. Saltzer、D.P. Reed和D.D. Clark撰写,出自麻省理工学院计算机科学实验室。本文旨在探讨分布式计算机系统中功能模块放置的设计原则,重点阐述了一种被称为“端到端”...

    【JavaScript源代码】JavaScript中arguments的使用方法详解.docx

    JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...

    arguments-read-and-assignment.rar_assignment

    标题“arguments-read-and-assignment.rar_assignment”提示我们这个压缩包可能包含有关JavaScript编程中的“arguments”对象和赋值操作的资料。在JavaScript中,“arguments”对象是一个特殊的对象,它在函数内部...

    js的隐含参数(arguments,callee,caller)使用方法.docx

    JavaScript中的隐含参数`arguments`, `callee`, 和 `caller`是函数内部的特殊变量,它们提供了关于函数调用的重要信息。下面将详细解释这三个参数的使用方法。 **arguments对象** `arguments`对象是一个非常有用的...

    ORA-00600: internal error code, arguments [4194]错误

    NULL 博文链接:https://gembler.iteye.com/blog/346242

    js中arguments,caller,callee,apply的用法小结.docx

    在JavaScript中,arguments、caller、callee和apply是四个与函数调用相关的特性,它们在编写高级和复杂的函数逻辑时非常有用。下面将详细介绍这些概念及其用法。 1. **arguments对象** arguments对象是一个特殊...

Global site tag (gtag.js) - Google Analytics