14

UnderscoreJS がeach/をどのように実装しているかを調べていました。forEach

//somewhere up top:
var breaker = {};

//then the each function
var each = _.each = _.forEach = function (obj, iterator, context) {
    if (obj == null) return;
    if (nativeForEach && obj.forEach === nativeForEach) {
        obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
        for (var i = 0, l = obj.length; i < l; i++) {
            if (iterator.call(context, obj[i], i, obj) === breaker) return;
        }
    } else {
        for (var key in obj) {
            if (_.has(obj, key)) {
                if (iterator.call(context, obj[key], key, obj) === breaker) return;
            }
        }
    }
};

//iterator = callback
//context  = optional third parameter of each to provide context in the callback
//obj      = the list
//key      = key of the object (i for index when an array)

基本的に、オブジェクト/配列内の各アイテムに対してコールバックを実行しています。しかし、これは私を混乱させます

if (iterator.call(context, obj[key], key, obj) === breaker) return;

私が理解していることから、コールバックがオブジェクトを返す場合、ループは中断しますが...アンダースコアモジュールの内部オブジェクトと比較するのはなぜですか? breaker. falseコールバックがオブジェクトを返す場合でも、同じオブジェクトではないため、常に評価されるわけではありfalseません(したがって、ループは決して壊れません)。この背後にある理由は何ですか?

4

1 に答える 1

13

彼らはeach内部的に使用しますsomesomeは短絡しているため、「秘密の」オブジェクトを使用してそこでブレークすることができますが、eachこの機能を通常のユーザーに公開することはありません。ネイティブ関数もそれを行わないため、ブレーク機能を公開しません (したがって、シムは可能な限りネイティブに似ています)。もしそうなら、ブレーク機能はネイティブ機能が利用できない場合にのみ利用可能であり、これは特に役に立ちません.

于 2012-07-22T13:44:22.037 に答える