0

私は最近JavaScriptを調べていて、次のルーチンに出くわしました。誰かがそれがどのように機能するかを私に説明できますか?

function groupConsecutive(numbers, successor) {
successor || ( successor = function(n) { return n + 1; });
var groups = [];
return _.each(numbers, function(number) {
    if (groups.length === 0) {
        groups.push([number]);
    } else { 
        successor.call(this, _.last(_.last(groups))) === number ? _.last(groups).push(number) : groups.push([number]);
    }
}, this), groups;
}

具体的には、少し理解しようとしていsuccessor || {ます。ここで「usestrict」を使用すると、「期待される代入または関数呼び出しで、代わりに式が表示されました」というエラーがスローされます。したがって、関数が呼び出される前にサクセサが定義されることはないため、そうすべきだと思います。したがって、ルーチンが起動するたびに私の考え方では、後継関数は定義されていません。このルーチンはunderscore.jsライブラリを使用しています。

4

2 に答える 2

3

||式は、演算子の副作用を使用します。演算子は短絡評価を使用するため、2番目のオペランドは、最初のオペランドがfalseと評価された場合にのみ評価されます。

したがって、この行:

successor || ( successor = function(n) { return n + 1; });

同じことをします:

if (!successor) {
  successor = function(n) { return n + 1; };
}

行には評価される式が含まれているが、結果は破棄されるため、strictモードはエラーをスローする際に正しく機能します。通常、それはあなたが結果で何かをするのを忘れたことを意味します。

次の形式を使用すると、||演算子を厳密モードで使用できます。

successor = successor || function(n) { return n + 1; };
于 2012-10-12T19:40:51.330 に答える
1

あなたが尋ねている行、

successor || ( successor = function(n) { return n + 1; });

短い書き方です:

if( successor === undefined ) {
    successor = function(n) { return n + 1; };
}

また:

successor = ( successor ? successor : function(n) { return n + 1; } );
于 2012-10-12T19:40:32.203 に答える