Apply()メソッド定義
関数のApply()メソッドとコールメソッドは同じ関数を持っていますが、違いは受信されたパラメーターが異なることです。
Apply()メソッドは2つのパラメーターを受信します。1つはオブジェクトで、もう1つはパラメーターの配列です。
apply()function
1。関数の範囲を拡張するために使用されます
例:
var color = 'red'; var o = {color: 'blue'}; function sakscolor(){console.log(this.color);} saycolor(); // "red" saycolor.apply(o); // "blue"ここで、関数はApply()メソッドを介してオブジェクトoに動的に結合されます。この時点で、これはOオブジェクトを指し、結果を「青」にします。
2。オブジェクトは、メソッドと結合関係を持つ必要はありません。
以下の結合の例を示して、適用してこの結合を解決する方法を確認しましょう。
var color = 'red'; var o = {color: 'blue'}; function sakscolor(){console.log(this.color);} o.saycolor = saycolor; o.saycolor(); // "blue"ここで、関数は最初にオブジェクトoに配置され、オブジェクトとメソッドは密接に結合され、メソッド呼び出しはオブジェクトoを通過する必要があります。
Apply()およびcall()メソッドを使用するほど柔軟ではありません。
上記のコードを参照して、前の例でコードを取得します。
var color = 'red'; var o = {color: 'blue'}; function sakscolor(){console.log(this.color);} saycolor(); // "red" saycolor.apply(o); // "blue"ここにはオブジェクトに縛られた方法はありませんが、それを使用する必要がある場合は、関数の適用または呼び出し方式を使用して動的にバインドします。
オブジェクトとメソッドの間に結合はありません。ここでは、ES5が提供するbind()メソッドを介して実行することもできます。
3。変数パラメーター関数パラメーター転送を実装します
任意の数の平均値を計算するための次の関数
平均(,,);平均();平均(,,,,,);平均(、、、、、);平均(、,,,,,);););
平均関数は、可変パラメーターまたは可変要素関数と呼ばれる例です(関数の要素の数は、その望ましい数のパラメーターを指します)。
もちろん、この関数は、受信配列の形式で記述することもできます。
AverageOfArray([,,]); AverageOfArray([]); AverageOfArray([,,,,,,]); AverageOfArray([,,,,,,,]);
可変パラメーターを使用する関数は、より簡潔でエレガントです。可変パラメーター関数には便利な構文があり、少なくとも発信者が提供されるパラメーターの数を事前に知ることができます。
このような配列がある場合
var scores = getallscores();
平均関数を使用して平均値を計算する方法は?
1。変数パラメーター関数バージョン。
現時点では、Apply()メソッドと組み合わせて使用できます。関数はこの変数の参照を使用していないため、最初のパラメーターのnullを渡します。コードは次のとおりです。
var scores = getallscores(); verag。apply(null、scores);
2。直接パラメーターは配列の形式です
ここでは、配列パラメーターを直接渡すことができます。
var scores = getallscores(); verageofarray(scores);
私は個人的には、上記の2つのフォームの両方が大丈夫だと思いますが、2番目のフォームはよりシンプルです。コードをリファクタリングせずに他の人によって書かれた機能に遭遇するときに簡単に対処できる方法について詳しく知ることができます。この利点はさらに大きくなっています。
4.変数パラメーターメソッドの値転送を実装します
例:バッファオブジェクトには、関数内の状態配列に追加された可変パラメーター追加メソッドが含まれています。
var buffer = {state:[]、append:function(){for(var i =、n = arguments.length; i <n; i ++){this.state.push(arguments [i]);}}}};現時点では、付録メソッドは複数のパラメーターを受け入れることができます。
buffer.append( 'hello、'); buffer.append( 'firtname'、 ''、 'lastname'、 '!'); buffer.append( 'newline');
次のようなフォーム
buffer.append(arg1、arg2、arg3、...)
Applyメソッドのこのパラメーターを使用すると、Appendメソッドを呼び出すように計算可能な配列を指定できます。
buffer.append.apply(buffer、getinputstrings());
注:ここのバッファーは重要です。別のオブジェクトが渡された場合、Adpendメソッドは間違ったオブジェクトの状態プロパティを変更しようとします。
ヒント
•適用方法を使用して、計算可能なパラメーター配列を指定して、可変パラメーターを使用して関数を呼び出す
•適用方法の最初のパラメーターを使用して、変数パラメーターメソッドの受信機を提供する
付録1
平均関数
関数平均(){var args = []。slice.call(arguments); var sum = args.reduce(function(prev、cur){return prev+cur;}); return parseint(sum/args.length、);}AverageOfArray関数
function AverageOfArray(arr){var sum = arr.reduce(function(prev、cur){return prev+cur;}); return parseint(sum/arr.length、);}ES5 bind()メソッド
この方法は、値がbind()関数に渡された値に拘束される関数のインスタンスを作成します。
例えば
var color = 'red'; var o = {color: 'blue'}; function sayscolor(){console.log(this.color);} var osaycolor = saycolor.bind(o); osaycolor(); // "blue"低いバージョンと互換性があります。次のバージョンを参照してください。
if(!function.prototype.bind){function.prototype.bind = function(othis){if(typeof this!== 'function'){//内部Iscallable functionthrow new TypeRror( 'function.prototype.bind- )、ftobind = this、fnop = function(){}、fbound = function(){return ftobind.apply(このinstance of fnop?this:othis、aargs.concat(array.slice.call(arguments));}; propertyfnop.prototype = this.prototype; } fbound.prototype = new fnop(); return fbound;};}