我最近在研究一些 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;
}
具体来说,我试图理解后继者|| {
位。如果我在这里使用“use strict”,它会抛出“预期赋值或函数调用,而是看到一个表达式”错误,所以我认为应该这样做,因为在调用函数之前从未定义后继者。因此,按照我的思维方式,每当例程启动时,后继函数都是未定义的。此例程使用 underscore.js 库。
最佳答案
该表达式使用了||
运算符的副作用。由于该运算符使用短路计算,因此仅当第一个操作数的计算结果为 false 时才计算第二个操作数。
所以,这一行:
successor || ( successor = function(n) { return n + 1; });
做同样的事情:
if (!successor) {
successor = function(n) { return n + 1; };
}
严格模式在抛出错误方面是正确的,因为该行包含一个已计算的表达式,但结果会被丢弃。通常这意味着您忘记对结果执行某些操作。
如果使用以下形式,则可以在严格模式下使用 ||
运算符:
successor = successor || function(n) { return n + 1; };
关于JavaScript 的后继者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865901/