参数属性定义在哪里?

时间:2009-11-06 16:12:06

标签: javascript

考虑以下代码

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

参数定义在哪里?为什么我的添加功能可用?

4 个答案:

答案 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)

argumentsfunction个对象的属性。有关详细信息,请参阅Using the arguments objectProperty: Function: arguments

值得注意的是arguments不是“真正的”数组,文档称之为“类似数组的对象” - 更多地在Turning JavaScript's arguments object into an array中。