arguments对象支持哪些属性

时间:2018-03-13 14:42:33

标签: javascript node.js

我在NodeJS的采访中被问到这个问题,

arguments对象支持哪些属性。

a) caller
b) callee
c) length
d) All

当我用Google搜索时,我发现所有3 properties都存在于参数对象中。

但是如果我尝试使用示例程序测试它,我会看到只存在Length属性。

这是我的示例程序:

var events = 'HelloWorld'

abc(events);
function abc(args) {
    console.log(args.charAt(1))   
    console.log(args.callee);
    console.log(args.caller);
    console.log(args.length);
}

这是输出:

e
undefined
undefined
10

因此基于上面的输出,只有length是有效属性,但基于以上所有3都是有效属性。那么对此的正确答案是什么?

1 个答案:

答案 0 :(得分:5)

您的范围变量args和本地变量Function.arguments是两个非常不同的东西。在函数abc(args)中,args是作用域变量,它将是您传入其调用的任何内容。

但是,

arguments是一个类似于本地数组的变量,可以在每个函数调用中访问,并与传递给函数的值相对应。例如:

function foo(args) {
    console.log(args);
    console.log(arguments[0]);
    console.log(arguments[1]);
    console.log(arguments[2]);
}

foo("bar", "baz", 123, 456);

这将输出:

> "bar"
> "bar"
> "baz"
> 123

尽管此函数只接受一个参数args,但局部变量arguments仍然存在,它表示传递给此函数的所有参数。这样我们仍然可以找到第二,第三和第四个参数的值,即使它们没有被声明为函数范围的一部分。

您遇到的问题是,您尝试访问范围变量Function.argumentsargs的属性,而这两个属性只是完全不同的变量。如果您想访问这些属性,请改为引用arguments

var events = 'HelloWorld'
abc(events);

function abc(args) { 
    console.log(args.charAt(1));   
    console.log(arguments.callee);
    // console.log(arguments.caller); //DEPRECATED
    console.log(arguments.length);
}