JavaScript 的后继者

标签 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;
}

具体来说,我试图理解后继者|| { 位。如果我在这里使用“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/

相关文章:

javascript - 从对象数组中提取数据(问题稍微复杂)

javascript - 如何使用 underscore.js 编辑具有字符串键值对的对象数组中的字符串?

javascript - gulp - 编译没有 `require` 的 Vue 组件

javascript - 在 IIFE 函数中使用 document.write 是否安全

javascript - Jquery/Ajax Done 事件仅运行一次

Javascript 添加缺失天数时间序列结果

javascript - 如何从 Backbone 集合中获取数据到模板

javascript - 我如何 Jest 模拟 Date.toLocaleDateString?

javascript - 如何将firebase返回的数据保存到变量

javascript - UnderscoreJS 未捕获类型错误 : Cannot call method 'replace' of undefined