考虑以下代码
function add(x, y) {
alert(arguments.length);
var total = x + y;
return total;
}
add(); // NaN alerts 0
add(2,3); // 5 alerts 2
add(3,3,5); //6 alerts 3
参数定义在哪里?为什么我的添加功能可用?
答案 0 :(得分:3)
自动为所有功能创建。
答案 1 :(得分:3)
有关何时以及如何创建arguments
对象的详细说明:
来自ECMAScript specification:
10.1.8参数对象
当控件进入功能代码的执行上下文时,会创建一个arguments对象 初始化如下:
arguments对象的内部[[Prototype]]
属性的值是原始的Object原型对象,它是Object.prototype
的初始值(见15.2.3.1)。
使用名称callee
和属性属性{ DontEnum }
创建属性。此属性的初始值是正在执行的Function对象。这允许匿名函数递归。
使用名称length
和属性属性{ DontEnum }
创建属性。此属性的初始值是调用者提供的实际参数值的数量。
对于每个非负整数arg
,小于length
属性的值,将创建一个名为ToString(arg)
的属性和属性属性{{1} }。此属性的初始值是调用者提供的相应实际参数的值。第一个实际参数值对应{ DontEnum }
,第二个对应arg = 0
,依此类推。在arg = 1
小于arg
对象的形式参数数的情况下,此属性与激活对象的相应属性共享其值。这意味着更改此属性会更改激活对象的相应属性,反之亦然。
答案 2 :(得分:1)
这只是Javascript的标准功能。无论何时调用任何函数,都会自动将参数数组添加到本地作用域。这允许函数从调用者接收可变或未知量的参数,并在必要时动态使用它们。
通常,当一个函数作为包装器放置在另一个函数中时,使用这个函数,其中精确参数是未知的并且对于包装器是任意的,包装器只是执行一个操作,然后将提供的参数直接传递给包装函数。
答案 3 :(得分:0)
arguments
是function
个对象的属性。有关详细信息,请参阅Using the arguments object或Property: Function: arguments。
值得注意的是arguments
不是“真正的”数组,文档称之为“类似数组的对象” - 更多地在Turning JavaScript's arguments object into an array中。