我在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都是有效属性。那么对此的正确答案是什么?
答案 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.arguments
中args
的属性,而这两个属性只是完全不同的变量。如果您想访问这些属性,请改为引用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);
}