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 || {一点。如果我在这里使用“use strict”,它会引发“预期分配或函数调用,而是看到一个表达式”错误,所以我相信它应该是因为在调用函数之前从未定义过继任者。因此,对于我的思维方式,每当例程启动时,后继函数是未定义的。此例程使用 underscore.js 库。

4

2 回答 2

3

该表达式使用运算符的副作用||。由于运算符使用短路评估,因此仅当第一个操作数评估为假时才评估第二个操作数。

所以,这一行:

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

做同样的事情:

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

严格模式在抛出错误方面做得很好,因为该行包含一个被评估但结果被丢弃的表达式。通常这意味着你忘记对结果做一些事情。

如果您使用这种形式,您可以||在严格模式下使用运算符:

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 回答