ブログを10年間書いていないことを記念して、最初のブログ投稿はこのような興味深いトリックから始まります-___-
ES5では、関数を呼び出すと、渡されるパラメーターが他の関数または条件に基づいて生成された場合、つまりパラメーターが渡されるパラメーターの数がわからない場合、元の関数を変更せずに何をすべきですか?
(もちろん、パラメーターをオブジェクトや配列に変更するなど、この記事に記載されている状況を避けるようにしてください。)
ほとんどの人は、適用を使用することでこの問題を完全に解決できることを知っているかもしれません。
呼び出しと同様に、最初のパラメーターは関数の呼び出しオブジェクトとして使用されます。つまり、呼び出し関数のこのポインターが最初のパラメーターとして書き換えられます。オブジェクトの方法ではない場合は、これを無視してヌルを渡すことができます。
違いは、次のパラメーターであるApplyは、すべてのパラメーターを配列内の呼び出し関数に渡すすべてのパラメーターを配置し、呼び出しが元の関数のように順番に追加されることです。
それは配列であるため、制御可能です。他の機能または論理的判断に基づいて配列を生成すると、動的な数値パラメーターを渡す目的を達成できます。
しかし、私は頭痛に遭遇しました。新しいものを使用してオブジェクトを作成するときに、動的なパラメーターを渡さなければなりませんでした。それは私を数年に1回しか連れていませんでした:
ES6を使用している場合、RESTパラメーターを使用している場合、上記の問題はありません。配列ARGSの前に3つのポイントを追加することは、構文エラーではなく、ES6が提供するRESTパラメーター作成方法であることに注意してください。あなたはそれを理解することができます...四角い括弧の後の文字とのargsアレイとのargsとのargs。
しかし、ES5で実装することは本当に不可能ですか?結局のところ、ほとんどのES6は構文砂糖であり、Babelなどのツールを使用してES5にコンパイルできます。質問を使用して、Babelを使用してコンパイルして確認しましょう。
最後のラインを見たとき、私はショックを受けました。恐れないでください。このコードを分析しましょう。まず、それを解き放ち、3つのステップで見てみましょう。
1. 2番目のパラメーターが適用されるように、concatを使用してパラメーターを配列に連結することは間違いありません。つまり、[null、1、2、3]を取得します。
2。適用を計算しましょう。最初のパラメーターFOOは、ネイティブバインドメソッドを呼び出すために関数を置き換えます。 2番目のパラメーター配列のコンテンツは、bindパラメーター、つまりfoo.bind(null、1、2、3)として渡されます。
3. BINDメソッドの最初のパラメーターは、このポインターを適用および呼び出し、変更するのに類似しており、その後のパラメーターは関数のデフォルトのプリセットの主要な引数値を埋め込むことができます。つまり、バインドが実行されると、最初のブラケットのセットに3つのパラメーター値が注入されたFooクラスが取得されます。
最後に、新しいfoowithargs(); 、パラメーターを渡す必要はありません。 New Foo(1、2、3)に相当します。