可以设置函数 arguments
属性(Mozilla 称之为“类似数组”的属性)的各个元素,但是 Mozilla 报告无法在 SpiderMonkey 中向该属性添加元素1.5 虽然这在 1.6 中已修复(请参阅此处关于 SpiderMonkey 的注释... https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments)。
这是一个有用的属性,从子类链接构造函数,创建一个参数列表以传递给函数(例如,myclassmethod.apply(this, arguments)
)等
但是我发现 V8 不会像 Mozilla 报告的 SpiderMonkey 1.5 那样延长长度。 (不确定其他 JavaScript 引擎、Opera、Rhino 等的状态如何)。
这实际上是 ECMA 功能吗? Mozilla 是否错误地认为这是一个错误,或者 V8 是否有一个错误需要修复?
[更新] 我发现使用 V8 可以分配 arguments.length
属性,因此可以有效地扩展 arguments
(或设置为任何长度您另有要求)。然而 JSLint 确实提示这是一个错误的分配。
[更新] 一些测试代码,如果有人想在 Opera、FF 等中尝试这个,创建一个子类的实例,用一个 arg 调用构造函数,同时向子类中的 arguments
添加一个元素构造函数并调用父类(super class)构造函数,父类(super class)应该报告两个参数:
function MyClass() {
if (arguments.length) {
console.log("arguments.length === " + arguments.length);
console.log("arguments[0] === " + arguments[0]);
console.log("arguments[1] === " + arguments[1]);
}
}
function MySubClass() {
console.log(arguments.length);
//arguments.length = 2; // uncomment to test extending `length' property works
arguments[1] = 2;
MyClass.apply(this, arguments);
}
MySubClass.prototype = new MyClass();
new MySubClass(1);
[更新] 当您通过外观对 arguments
进行任何类型的赋值时,JSLint 实际上会提示(例如,arguments[0] = "foo"
)。所以也许 JSLint 在这里也有一些工作要做。
最佳答案
不确定这是否是您要查找的内容,但您可以将参数对象制作成标准数组:
var args = [].slice.call(arguments, 0);
[编辑] 所以你可以这样做:
myclassmethod.apply(this, [].slice.call(arguments, 0).push(newValue));
关于javascript - "arguments[n] cannot be set if n is greater than the number of formal or actual parameters"错误的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10298873/