20

これらの2つの関数、 _.forEachおよび$.eachは、それぞれから取得され、同じものを作成しているようですunderscorejQuery

ある実装を他の実装よりも優先する理由として考えられるものは何ですか?

4

3 に答える 3

17

_.forEach$.eachコールバックに渡される引数によって異なります。

を使用する場合_.forEach、コールバックに渡される最初の引数はキーではなく値です。
したがって、キーについてまったく気にしない場合は、 を使用する必要があります_.forEach

その他の違い:

  1. _.forEachArrray.prototype.forEach最新のブラウザーでネイティブを使用するため、少し高速になります。
  2. この値も異なります。jQuery の動作は標準に準拠していませんが、アンダースコアは準拠しています。
于 2012-12-11T16:25:22.340 に答える
6

jQueryは次のようになります。

something.each( function(index, Element) )

アンダースコアは次のようになります。

_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])

ネイティブarray.forEachは次のようになります。

array.forEach(function(Element, index, list), [context])

それで:

  • アンダースコアは、ネイティブと同じ引数の順序を維持しますforEach
  • JQueryとUnderscoreの実装には2つの違いがあります。
    • JQueryセットthisElementネイティブおよびアンダースコアに設定すると、独自のコンテキストを提供できます
    • ネイティブとアンダースコアは、コールバックの3番目の引数としてリスト自体も提供します。

編集:コンテキストを設定できると便利なのはなぜですか?

ある種のオブジェクトがあると考えてください。

var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);

配列のすべての値でそのメソッドを呼び出したいとします。
コンテキストパラメータを使用すると、次のように簡単に言うことができます。

myArray.forEach(worker.process, worker);

これがないと、より詳細にする必要があります(そして、要素ごとにもう1つの関数呼び出しを実行します)。

// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );

これは、JQueryのforeaching規則によって物事が不便になる状況の1つです。

于 2012-12-11T16:32:20.643 に答える
6

どちらも主に、IE8 では使用できないforEach関数の代わりを提供します。

配列を反復処理している場合、それらはあまり追加しません。

コールバック引数の順序を除けば、主な違いは、jQuery では値がコールバックの呼び出しのコンテキストとしても使用できることです (これが、重要度の低い値が提供される 2 番目の引数のみである理由です)。これは、関数に引数を渡すことを本当に避けたい場合を除いて、それを好む主な理由ではありません:

var product = 1;
$.each([1, 2, 3], function(){ product *= this });

ほとんどの場合、両方のライブラリを使用するわけではないため、使用しているライブラリが提供する反復関数を使用するだけです。

両方のライブラリをインポートする場合は、アンダースコア関数を次のように使用することをお勧めします

  • 配列に対する標準の ECMAScript 関数に最も似ているため、IE8 が廃止された日により簡単に移行できます。
  • 利用可能な場合はネイティブ関数を使用するため、より効率的です。

ソースを参照してください

...
if (nativeForEach && obj.forEach === nativeForEach) {
     obj.forEach(iterator, context);
...
于 2012-12-11T16:27:08.217 に答える