双括号而不是IIFE或闭包,这是什么?它是有效的JS语法吗?

时间:2018-07-10 10:15:27

标签: javascript node.js

我一直试图学习和理解KnexJS源代码,直到遇到一段我不知道它是什么的代码。

  config = (0, _lodash.assign)({}, config, {
  connection: (0, _parseConnection2.default)(config.connection).connection
});

简体版

config = (0, Args1)({}, config, {Args2});

让我感到困惑的是,在括号前没有“功能”关键字或任何“标识符” ...

我在这里找到了相同但没有相似的问题:double parentheses,这是可以理解且不同的...它是有效的JS吗?如果是,那是什么意思?

1 个答案:

答案 0 :(得分:2)

它是逗号运算符(计算以逗号分隔的表达式列表,解析为最后一个表达式的值),并结合了带有全局调用上下文而不是{的调用上下文的_lodash.assign的调用{1}}。这是一个更简单的示例:

_lodash

如您所见,单独调用const obj = { abc: function(arg) { console.log(this); console.log('abc called with ' + arg); } } obj.abc('foo'); (0, obj.abc)('foo')会导致调用上下文为obj.abc,而obj会导致调用上下文为(0, obj.abc)('foo')。我认为这是一种缩小技术-更清晰,更易理解的代码看起来像

window

obj.abc.call(window, 'foo')