我最近看了一些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库。
答案 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; } );