Javascript添加额外的参数

onl*_*oon 35 javascript

让我们来看看这段代码:

var mainFunction = function() {
  altFunction.apply(null, arguments);
}
Run Code Online (Sandbox Code Playgroud)

传递给"mainFunction"的参数是动态的,它们可以是4或10无关紧要.但是我必须将它们传递给altFunction并且我必须在参数列表中添加一个EXTRA参数.

我试过这个:

var mainFunction = function() {
  var mainArguments = arguments;
  mainArguments[mainArguments.length] = 'extra data'; // not +1 since length returns "human" count.

  altFunction.apply(null, mainArguments);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,我该怎么做?

I H*_*azy 58

使用 Array.prototype.push

[].push.call(arguments, "new value");
Run Code Online (Sandbox Code Playgroud)

没有必要浅层克隆arguments对象,因为它和它.length是可变的.

(function() {
    console.log(arguments[arguments.length - 1]); // foo

    [].push.call(arguments, "bar");

    console.log(arguments[arguments.length - 1]); // bar
})("foo");
Run Code Online (Sandbox Code Playgroud)

来自ECMAScript 5,10.6 Arguments Object

  1. [[DefineOwnProperty]]在obj传递"length",属性描述符{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}和false作为参数上调用内部方法.

所以你可以看到它.length是可写的,所以它会用Array方法更新.

  • [] .splice.call(arguments,0,0,NEW_VAR)将它放在第一个参数上,当你有一个首先需要某个值的函数时非常方便. (2认同)
  • 我认为这是在'严格模式'中抛出错误.如果遇到问题,请使用`Array.prototype.push.call(arguments,'bar')`. (2认同)

Vis*_*ioN 31

arguments不是纯数组.你需要制作一个普通的数组:

var mainArguments = Array.prototype.slice.call(arguments);
mainArguments.push("extra data");
Run Code Online (Sandbox Code Playgroud)

  • *"你不能直接改变参数数组."*当然可以. (7认同)
  • 应该注意的是,虽然你可以修改这样的参数,[这样做可以防止js vm能够优化函数调用](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3 - 管理 - 参数).所以,如果你在一个被调用很多的函数中操作这样的参数,可能会有性能影响. (6认同)