有没有办法在底层范围内重用 if(...) 条件的值?

Is there a way to reuse the if(...) condition's value in the underlying scope?

为什么

我非常喜欢紧凑的代码和新的语言特性。因此,我试图找到一种方法来重用打开当前作用域的条件语句的值,而无需事先将其保存为父作用域中的变量,在父作用域中它不再使用。

这将使我的代码更紧凑,但更易于阅读,这是一个相当主观的壮举。可能有多种方法,因此欢迎各种解决方案(最好是 ES8,这不适用于生产 use/professional 环境)。

澄清:

以下函数是 cpu 密集型

fetchData()      // returns [object Object] or false on error

它也可以是一个输入流,它的输出在每次函数调用时都会不同,或者是一个键值对查找,它必须在短时间内发生数千次但只能发生synchronously/blocking。

我目前的做法:

我必须输入数据 3 次,它污染了全局范围。另外,在使用断点调试时,在尽可能小的范围内找不到变量。

let data = fetchData()

if (data)
  useData(data)
else
  error()

不是一个好的解决方案:

数据变量仍然出现了3次,污染了父作用域,声明时你还不知道它意味着什么。单个等式 (=) 符号可能被 reader 错误解释或被其他人错误更正。

let data
if (data = fetchData())
  useData(data)

偷懒的方法:

if (fetchData())
  use(fetchData())

我的愿望:

'let'避免将其解释为==条件语句:

if (let data = fetchData()) { // data is declared in the child scope
  parseData(data)
} else {
  console.error('meh')
}

结果:语法错误:意外标识符

if (fetchData()) {
  parseData(fi)
}

// some kind of symbol, i know this is xor, but it seemed appropriate
if (long.object.key.value().chain.data)
  return JSON.parse(^)

if (fetchData()) {
  parseData(condition.value)   // or .pop() or just 'condition'
}

回顾我当前的方法时,我只是觉得这是一种信息过载,即使它有其优点。我相信这可以在代码非常密集或 function/variable 名称如此明显以至于几乎形成一个句子的情况下提高可读性。

不,没有这样的语法功能。要走的路是块范围

{
  const data = fetchData()
  if (data)
    useData(data)
  else
    error()
}

或 IIFE

(function(data) {
  if (data)
    useData(data)
  else
    error()
}(fetchData()));

你当然也可以把它变成一个可重复使用的函数:

function If(predicate, then, other) {
    return function(value) {
        if (predicate) then(value) else other(value)
    };
}
If(Boolean, useData, error)(fetchData());

这里有一个不用声明变量的方法:

[fetchData()].filter(Boolean).map(useData);

这只是为了好玩,我不建议实际使用它,因为它既不高效,也不是很清晰的代码。

注意:如果您还需要 meh 输出...然后扩展到:

[fetchData()].filter(Boolean).map(useData).length || console.log('meh');