javascript后继者

时间:2012-10-12 19:35:09

标签: javascript underscore.js

我最近看了一些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库。

2 个答案:

答案 0 :(得分:3)

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

所以,这一行:

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

做同样的事情:

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

严格模式在抛出错误时是正确的,因为该行包含一个被计算的表达式,但随后结果被丢弃。通常这意味着您忘记对结果做某事。

如果您使用此表单,则可以在严格模式下使用||运算符:

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

答案 1 :(得分: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; } );
相关问题