1

.applyメソッドを使用せずに、引数を配列としてjavascript関数に渡す方法があるかどうかを調べようとしています。ユーザーの観点から見ると、コードは次のようになります。

var args = [1, 2, 3, 4];
doSomething(args);

doSomething()常に同じ関数になるとは限らないため、引数の配列を使用するように記述できないことに注意してください。理想的には、これはどの関数でも機能するはずです。私がやろうとしているのは、基本的に配列を引数配列のようなオブジェクトに変換することだと思います。

関数の引数オブ​​ジェクトを次のように設定できるのではないかと考えていました。

function.arguments = otherArguments;

しかし、いつそれをしなければならないのかわかりません(関数が実行を開始した後、実際に引数で何かを行う前に、どういうわけかそれをしなければならないのではないでしょうか?)

私がこれを行おうとしている理由は、学習目的で独自の.apply関数を作成しようとしているためです。これは可能ですか?

4

3 に答える 3

1

私はこれをまったくお勧めしませんが、あなたが非常識になりたいのであれば、呼び出している関数のアリティに対してカリー メソッドを動的に生成し、結果のカリーをループで呼び出すことができます。

function func(a,b,c,d) {
  console.log([a,b,c,d]);
  return "Return Value";
}

// Using a static 4 argument curry.
function curry4(f) {
  return function(a) {
    return function(b) {
      return function(c) {
        return function(d) {
          return f(a,b,c,d);
        }
      }
    }
  }
}

var args = [1,2,3,4];
for(var i=0,f=curry4(func);i<func.length;i++) { f = f(args[i]); }
console.log(f); // f is return value of `func`

最大 12 個のオプション引数をサポートする例については、こちらを参照してください。

でもこの道はきっと狂気へと続く…。

于 2012-08-29T20:08:31.100 に答える
1

いいえ、仕方がありません。1 つの機能に対して 1 つのツールであり、最適なツールは ですapply

を使用しない独自の関数を作成する必要がある場合はapply、eval を使用する必要があります。

function apply(fn, thisObj, args) {
    var obj = {fn: fn};
    var str = "obj.fn(";
    for (var i=0; i<args.length; i++)
         str += (i?',':'') + "args["+i+"]";
    str += ");";
    return eval(str);
}
于 2012-08-29T19:30:49.613 に答える
0

言及するだけです:

setTimeout を使用する場合は、params を渡すことができます:

    setTimeout( _function_name_, delay, param1,param2,param3...)

このようにして、適用を使用せずにパラメーターが関数に渡されます

于 2013-03-13T23:31:27.390 に答える