のようなJavascript配列メソッドには、コールバックを呼び出すためのコンテキストとして使用されるパラメーターがありますforEach
。thisArg
array.forEach(callback[, thisArg])
、、、および。every
_ some
_ ただし、そのようなパラメータはありません。これには特別な理由がありますか、それとも必要ない理由がありますか?filter
map
reduce
reduceRight
たとえば、次を使用した機能合成の次の実装について考えてみますreduceRight
。
function compose () {
var fns = [].slice.call(arguments,0);
return function result() {
return fns.reduceRight(
function (prev,cur){
return [cur.apply(this,prev)];
},
arguments
)[0];
};
}
これを「これを意識した」ものにしたいので、作成されている関数は、によって返される関数compose
が呼び出されるコンテキストで呼び出されます。現在、これらはグローバルオブジェクトのコンテキストで呼び出されているようです。var self=this;
関数の先頭で古いものを実行し、それを現在の呼び出しresult
の最初の引数として使用できますが、引数を取る場合は不要です。cur.apply
this
reduce
thisArg
私はここで何かが足りないのですか、そしてreduce
それがこれを不必要または役に立たないものにする何かがありますか?
アップデート
@kangaxはい、それは私に起こりました。APIの設計を批判することは私からはほど遠いですが、の署名はreduce
私には少し奇妙に思えます。2番目のオプションの引数は、通常はデフォルト値を持つ通常のオプションの引数とは機能が異なります。代わりに、その存在または不在によって動作が変更され、基本的にシグネチャ(引数数)に基づいて関数がオーバーロードされます。2番目のパラメーターがない場合、配列の最初の要素が開始値になり、コールバックへの最初の呼び出しは2番目の値に対して行われます。この動作は、呼び出すだけで簡単にエミュレートできるようです。
array.slice(1).reduce(fn,array[0])
2番目の引数が省略された場合の特別なルールを組み込む代わりに、推定が正しければ、引数を指定する場所を特定することも本質的に不可能になりthisArg
ます。繰り返しになりますが、仕様がハッシュ化されている間、そのような問題はすでに議論されていたと確信しています。そのようなアプローチには正当な理由があるかもしれません。