0001. JavaScript Function.arguments 属性详解

时间:2021-1-8 作者:admin

arguments属性是正在执行的函数的内置属性,返回该函数的arguments对象。arguments对象包含了调用该函数时所传入的实际参数信息(参数个数、参数值等)

该属性属于Function对象,所有主流浏览器均支持该属性

语法

[functionObject.]arguments

只有在当前函数正在执行时该属性才有效

返回值

arguments属性的值为Object类型,返回正在执行的当前函数的arguments对象

arguments对象包含调用该函数时所传入的实际参数信息,例如:参数的个数和参数的值。我们可以通过arguments属性让函数处理可变数量的参数

arguments对象有以下三个属性:

  • length属性,返回实际传入的参数个数。
  • callee属性,返回当前函数的引用(匿名函数可以使用该属性实现递归调用)。
  • 0…n属性,以顺序索引访问传入的具体参数。例如,使用arguments[0]可以访问传入的第1个参数,arguments[1]可以访问传入的第2个参数

arguments对象具有length属性和0...n属性,看起来与数组的访问方式相同,但arguments并不是数组,它没有数组对象所具备的其他成员属性和方法。

示例&说明

function test() {
    // 实际传入的参数个数:3
    document.writeln('实际传入的参数个数:' + arguments.length);
    /* "test."可以省略 */
    for(var i = 0; i < test.arguments.length; i++){
            document.writeln('传入的第' + (i + 1) + '个参数:'+ arguments[i]);    
    }
    // 传入的第1个参数:1 传入的第2个参数:张三 传入的第3个参数:true
    // callee属性返回的就是当前函数
    document.writeln( arguments.callee === test ); // true
};


test(1, '张三', true);

length属性详解

arguments.length属性用于返回调用当前函数所传入的真实参数个数。

该属性属于arguments对象,所有主流浏览器均支持该属性

语法
[functionObject.]arguments.length
返回值

arguments.length属性的值为Number类型,返回调用当前函数所传入的实际参数个数。

arguments.length属性只有当函数开始执行时才被定义

示例&说明
function test() {
    document.writeln('实际传入参数个数为: ' + arguments.length);
};
test(); // 实际传入参数个数为: 0

function foo(a, b) {
    // "foo."可以省略
    document.writeln('实际传入参数个数为: ' + foo.arguments.length);
};
foo(1, 2); // 实际传入参数个数为: 2

function bar(a, b) {
    document.writeln('实际传入参数个数为: ' + arguments.length);
}
bar(1, 2, 3, 4); // 实际传入参数个数为4

callee属性详解

arguments.callee属性用于返回当前正在执行的Function对象

语法
[functionObject.]arguments.callee
返回值

arguments.callee属性的值为Function类型,返回当前正在执行的函数
简而言之,arguments.callee 返回该 arguments 对象所属的函数

arguments.callee属性是arguments对象的一个成员,该属性仅当相关函数正在执行时才可用

arguments.callee属性的初始值是正被执行的Function对象。这将允许匿名函数成为递归的

示例&说明
function test() {
    // "test."可以省略
    document.writeln( test.arguments.callee );
    // function test(){ document.writeln( arguments.callee ); document.writeln( arguments.callee === test ); }

    // arguments.callee 就是当前执行函数的自身
    document.writeln( arguments.callee === test ); // true
};

test();

// 输出斐波那契数列(1,2,3,5,8,13……)第10项的数字
// 内部使用匿名函数+函数递归来实现
// 由于是匿名函数,在函数内部无法通过函数名来递归调用该函数
// 我们可以通过arguments.callee来取得当前匿名函数,从而进行递归调用
document.writeln(function(n) {
    if (n <= 2) {
        return n;
    } else {
        return arguments.callee(n - 1) + arguments.callee(n - 2);
    }
}(10));

n个参数属性详解

arguments对象的0...n属性用于返回调用当前函数所传入的参数。访问arguments的这些属性类似于访问数组中的元素

该属性属于arguments对象,每个函数在被调用时,都有一个内置的arguments对象。所有主流浏览器均支持该属性

语法
[functionObject.]arguments[ n ]
参数
参数 描述
n Number类型传入参数的顺序索引,第一个参数的索引为0

参数n应该是在 0arguments.length-1 范围内的整数。其中,0表示传入的第一个参数,1表示传入的第二个参数……arguments.length-1表示传入的最后一个参数。如果参数n超出该范围,将返回undefined

返回值

0...n的值为任意类型,返回调用当前函数所传入的第n + 1个参数

0...n属性返回的值就是传递给正在执行的当前函数的参数值。虽然arguments对象不是数组,但访问组成arguments对象的各个元素的方法与访问数组元素的方法相同

示例&说明
function test() {
    // 循环输出调用当前函数时传入的参数
    for(var n = 0; n < arguments.length; n++){
        document.write( arguments[n] + '|');
    }
    document.write('<br>'); // 输出换行符进行区分
};
test(); // (空字符串)
test('Code', 'huarxia.love', 12, true); // Code|huarxia.love|12|true|
test('张三', false, 12.315); // 张三|false|12.315|

function foo() {
    // arguments前也可以加上函数名称
    for(var n = 0; n < foo.arguments.length; n++){
        document.write( foo.arguments[n] + '|');
    }
    document.write('<br>');
};
foo('Hello', 'World'); // Hello|World|

// 使用arguments对象实现任意多个数的求和
function sum() {
    var sum = arguments[0];
    for(var n = 1; n < arguments.length; n++){
        sum += arguments[n];
    }
    return sum;
}
document.writeln( sum() ); // undefined
document.writeln( sum( 1, 5 ) ); // 6
document.writeln( sum( 1, 212, 21, -14, 23 ) ); // 243
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。