函数中arguments对象的使用汇总

深入理解JavaScript的Arguments对象
本文详细解析了JavaScript中Arguments对象的功能与应用,包括其实现函数重载、递归及与函数参数之间的交互机制。

任何函数内部都包含了arguments对象,其表现与数组类似,可以使用下标访问arguments的数据成员。

arguments主要用于保存调用函数的实际参数数据。

如:
function test() {
    alert(arguments[0]); //1
    alert(arguments[1]); //2
}
test(1, 2, 3)

函数的形参(命名参数)列表也是保存传给函数的实参数据,arguments与形参数据是同步的。
arguments对象与形参并不是指向同一个内存空间,而是不同的内存空间而存储的数据是同步的。
修改arguments[n],相等于修改了第n个形参的值(假设从0开始),反过来同理。

如:
function test(a, b, c) {
    arguments[1] = 1;
    alert(b); // 1
    alert(arguments[1]==b);// true

    b = 3;
    alert(arguments[1]); // 3
    alert(arguments[1]==b); //true
}
test(1, 2, 3);

特殊
如果传递给函数的实参少于形参,则arguments与未初始化的形参数据不会进行关联同步。
function test(a, b, c) {
    arguments[2] = 1;
    alert(c); // undefined
    alert(c == arguments[2]); // false

    c = 3;
    alert(c);//3
    alert(arguments[2]); // 1
}
test(1, 2);

arguments对象的属性
length:传递给函数的实际参数个数
callee:指向当前arguments所在的相应函数

如:
function test(){
    alert(arguments.callee == test); //true
}
test();

arguments是javascript关键字,不能作为变量、函数等标识符

函数重载
在很多编程语言中都包含此特性,定义多个同名不同参数列表的重载函数。然而javascript却不能同时定义多个同名函数,
后面定义的函数会覆盖前面的同名函数定义。javascript使用arguments和对实参类型的判断来实现函数的重载。
function test() {
    if (typeof arguments[0] == 'number') {
          alert("this is a number");
    } else if (typeof arguments[0] == 'string') {
          alert("this is a string")
    } else {
          alert("Oops");
    }
}

test(1);// this is a number
test("javascript");// this is a string
test(true);// Oops

函数递归
函数递归是编程算法当中一个有利的武器,能够使用程序结构简化明了。使用arguments.callee来实现函数递归。
斐波那契数列是典型的递归案例。
f(0) = 0;
f(1) = 1;
f(n) = f(n-1) + f(n-2)
递归实现方法一:
function fibonacci(n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n-1) + fibonacci(n-2);
}
缺点:直接使用函数名后,如果更改了函数名,需要在三处进行维护,可维护性比较差。
递归实现方法二:
function fibonacci(n) {
    if (n == 0 || n == 1) return n;
    return arguments.callee(n-1) + arguments.callee(n-2);
}
使用arguments.callee替换函数名,使用函数体与函数名进行最大的解偶。

转载于:https://www.cnblogs.com/Lbeta/archive/2012/06/04/2534512.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值