3

列挙子メソッドを備えたほとんどのライブラリ (ネイティブ JavaScript でさえも) ではcontext、イテレータに a を渡すことができます。

function reduce(iterator, memo, context){
    this.each(function(item, idx, list){
        memo = iterator.call(context, memo, item, idx, list)
    });
    return memo;
}

問題は、いつbind同じ機能を簡単に提供できるのかということです。

stooges.reduce(function(memo, stooge){
  ...
}, context) // as argument vs...

stooges.reduce(function(memo, stooge){
  ...
}.bind(context))

bindこれは、すべてのプラットフォームですぐに利用できるわけではないため、当分の間存在するものですか? それとも、単にcalling よりもbinding の方がオーバーヘッドが少ないからですか? 私はいつも、関数が取る引数が少ないほど良いと読んでいます。つまり、0 引数を取る関数は、1 を取る関数よりも 2 を取る関数よりも優れています。

4

1 に答える 1

2

create を使用.bindして新しい関数を返します。場合によっては、javascript VM によって作成されるオブジェクト/変数の数を制限して、ガベージ コレクターのクリーニング サイクルを活用したいことがあります。

また、bind「エミュレートされた」バインディング ソリューションよりもかなり遅いことが知られています (callおよびを使用apply): Function.prototype.bind が遅いのはなぜですか?

それ以外の場合は、多くの場合、コンテキストをパラメーターとして渡す方が適切で読みやすいです。

ES6 アロー関数は lexical を維持できるようになるためthis、さらに簡単になります。

// considering object context
var self = this;
stooges.reduce((memo, stooge) => (this === self));
于 2013-06-28T02:52:20.717 に答える