2

underscore.js ライブラリを調べているとき、私は出くわしました

for (var i = 0, l = obj.length; i < l; i++) {
    if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
}

// Establish the object that gets returned to break out of a loop iteration.
breaker = {};

なぜreturn最後に使われるのですか?そして何をi in objチェックしますか?

4

3 に答える 3

3

return関数が存在します (指定された戻り値がある場合)。これについては、チュートリアルで説明します。ループ構成では、「早期に停止」します。

prop in objobj(またはチェーンされた [[prototype]]) がprop(を含む任意の値を持つ) プロパティを持っている場合にのみ true を返す式ですundefined。この場合、 の値がi範囲を超えていることに注意してください[0, length)。ここでの結果は、「配列内の割り当てられたインデックスごと」です。

iterator関数に評価されcall()、コンテキスト (this設定可能) で呼び出されます。特殊breaker変数は、特殊なセンチネル オブジェクトに評価されます。オブジェクトの場合、===は「同一性」であり、他の新しいオブジェクトは===オブジェクトに割り当てられませんbreaker

要するに、これはArray.forEach(ECMAScript ed. 5) またはjQuery.each(ユーティリティ メソッド) のバリアントであり、スパース配列を反復処理し、いくつかの追加の引数を渡し、「早期終了」を許可します。

ハッピーコーディング。

于 2012-04-04T03:01:33.547 に答える
1

breakerコードが反復子オブジェクトをループし、変数に到達すると中断するようです。returnステートメントは関数を終了します。

于 2012-04-04T02:50:12.577 に答える
1

ループbreakerから抜け出すために自分で使用できるものではないことに注意してください。_.eachアンダースコア自体の内部でのみアクセスでき_.all_.someメソッドによって内部的に使用されます。

于 2013-01-08T00:59:21.523 に答える