40

このコードを見てみましょう:

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);
}

しかし、それはうまくいかないようです。これどうやってするの?

4

11 に答える 11

64

使用する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 オブジェクトから

  1. [[DefineOwnProperty]]引数としてobj "length"、Property Descriptor {[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}、および falseを渡して内部メソッドを呼び出します。

書き込み可能であることがわかります.lengthので、Array メソッドで更新されます。

于 2012-11-28T17:33:11.670 に答える
34

argumentsは純粋な配列ではありません。それから通常の配列を作成する必要があります。

var mainArguments = Array.prototype.slice.call(arguments);
mainArguments.push("extra data");
于 2012-11-28T17:32:19.360 に答える
4

argumentsオブジェクトは配列ではありません。配列のようなものですが、違います。ただし、配列に変換することはできます。

var mainArguments = [].slice.call(arguments, 0);

次に、別の値を最後にプッシュできます。

mainArguments.push("whatever");
于 2012-11-28T17:32:11.150 に答える
1
var mainFunction = function() {
    var args = [].slice.call( arguments ); //Convert to array
    args.push( "extra data");
    return altFunction.apply( this, args );
}
于 2012-11-28T17:32:18.880 に答える
1

arguments配列」は配列ではないため (Crockford によると、これは JavaScript の設計上のバグです)、それを行うことはできません。ただし、配列に変換できます。

var mainFunction = function() {
  var mainArguments = Array.prototype.slice.call(arguments);
  mainArguments.push('extra data');

  altFunction.apply(null, mainArguments);
}
于 2012-11-28T17:33:31.063 に答える
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"]
//
//
于 2013-08-12T22:56:09.067 に答える
0

私のようにオプションの引数を追加する方法を探していて、唯一の省略されたものではないかもしれない ( myFunc = function(reqiured,optional_1,optional_2,targetOptional)like の呼び出しで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;
于 2018-03-17T18:07:24.720 に答える