让我们来看看这段代码:
var mainFunction = function() {
altFunction.apply(null, arguments);
}
传递给“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);
}
但这似乎不起作用,我怎么能这样做?
答案 0 :(得分:58)
使用Array.prototype.push
[].push.call(arguments, "new value");
没有必要对arguments
对象进行浅层克隆,因为它及其.length
是可变的。
(function() {
console.log(arguments[arguments.length - 1]); // foo
[].push.call(arguments, "bar");
console.log(arguments[arguments.length - 1]); // bar
})("foo");
来自ECMAScript 5,10.6 Arguments Object
- 在obj传递
醇>[[DefineOwnProperty]]
,属性描述符"length"
和false作为参数时调用{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}
内部方法。
因此,您可以看到.length
是可写的,因此它将使用Array方法进行更新。
答案 1 :(得分:28)
arguments
不是纯数组。你需要用它制作一个普通的数组:
var mainArguments = Array.prototype.slice.call(arguments);
mainArguments.push("extra data");
答案 2 :(得分:4)
arguments
对象不是数组;它是喜欢一个数组,但它是不同的。你可以把它变成一个数组:
var mainArguments = [].slice.call(arguments, 0);
然后你可以将另一个值推到最后:
mainArguments.push("whatever");
答案 3 :(得分:2)
2016年更新:您必须在添加元素之前将参数转换为数组。除了许多帖子中提到的切片方法:
var args = Array.prototype.slice.call(arguments);
您还可以使用Array.from()方法或spread运算符将参数转换为实数数组:
var args = Array.from(arguments);
或
var args = [...arguments];
以上内容可能无法通过您的javascript引擎优化,MDN建议以下内容可能会优化:
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
答案 4 :(得分:1)
var mainFunction = function() {
var args = [].slice.call( arguments ); //Convert to array
args.push( "extra data");
return altFunction.apply( this, args );
}
答案 5 :(得分:1)
arguments
“数组”不是数组(根据Crockford的说法,它是JavaScript中的设计错误),所以你不能这样做。但是你可以把它变成一个数组:
var mainFunction = function() {
var mainArguments = Array.prototype.slice.call(arguments);
mainArguments.push('extra data');
altFunction.apply(null, mainArguments);
}
答案 6 :(得分:0)
添加其他参数并返回新数组的一个班轮:
[].slice.call(arguments).concat(['new value']));
答案 7 :(得分:0)
//
// var
// altFn = function () {},
// mainFn = prefilled( altFn /* ...params */ );
//
// mainFn( /* ...params */ );
//
//
function prefilled ( fn /* ...params */ ) {
return ( function ( args1 ) {
var orfn = this;
return function () {
return orfn.apply( this, args1.concat( cslc( arguments ) ) );
};
} ).call( fn, cslc( arguments, 1 ) );
}
// helper fn
function cslc( args, i, j ) {
return Array.prototype.slice.call( args, i, j );
}
// example
var
f1 = function () { console.log( cslc( arguments ) ); },
F1 = prefilled( f1, 98, 99, 100 );
F1( 'a', 'b', 'c' );
//
// logs: [98, 99, 100, "a", "b", "c"]
//
//
答案 8 :(得分:0)
在这种情况下,使用call()
代替apply()
可能更为舒适:
function first(parameter1, parameter2) {
var parameter3 = "123";
secondFunction.call(
this,
parameter1,
parameter2,
parameter3);
},
答案 9 :(得分:0)
var myABC = '12321';
someFunction(result, error, myCallback.bind(this, myABC));
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
答案 10 :(得分:0)
对于那些喜欢我的人来说,正在寻找一种方法来添加一个可选的参数,并且可能不是唯一被忽略的参数(myFunc = function(reqiured,optional_1,optional_2,targetOptional)
与myFunc(justThisOne)
这样的调用),这可以作为如下:
// first we make sure arguments is long enough
// argumentPosition is supposed to be 1,2,3... (4 in the example above)
while(arguments.length < argumentPosition)
[].push.call(arguments,undefined);
// next we assign it
arguments[argumentPosition-1] = arguments[argumentPosition-1] || defaultValue;