1

throw $breakchrome 21とプロトタイプ1.7.1を使用して、使用が機能しないことを発見しました。

Errorによって停止されるべきだったときにブラウザにスローされます

if (e != $break) { ... }

injectこれは、Chromeにネイティブ実装があり、他の組み込み関数と同じ機能でラップされていないために発生していると思われます。

これを想定するとき、私は正しいですか、それとも私のコードに何か問題がありますか?

再作成するコード:

var a = [1,2,3,4,5,6,7,9].inject([], function(arr, e) {
    console.log(e);
    if (e === 5) {
        throw $break;
    }

    arr.push('Done ' + e);
    return arr;
});
console.log('Final Array : ' + a)

アップデート

Firefox14とIE9でテストしたところ、同じエラーが発生します。

<strong>更新(2015)

これは1.7.3、Chrome45.0.2454.101でテストされたによって修正されたようです。

ソースを確認して確認し、reduce削除しました

4

1 に答える 1

4

問題は、プロトタイプ1.7.1の時点で、Array#inject2つの実装があり、動作が異なることです。(これは良くないtmです。)このフィドルこれを使用して見ることができるように、これはプロトタイプ1.7.1と1.7.0の間の重大な変更です。

ネイティブArrayオブジェクトがreduceES5の関数を持っている場合は、Array#injectそれを処理せずに使用しますが、持っ$break ていない場合Array#injectEnumerable#inject、を使用してEnumerable#each、を処理します$break

プロトタイプ1.7.1のソースを検索すると、これを確認できます。最初に非reduceバージョンEnumerableを見つけ、次にreduceバージョンをさらに下に見つけます。バージョンがない場合は、バージョンがバージョンを取得しArrayていることがわかります。ArrayEnumerablereduce

于 2012-09-25T13:02:13.117 に答える