有没有办法在底层范围内重用 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');
为什么
我非常喜欢紧凑的代码和新的语言特性。因此,我试图找到一种方法来重用打开当前作用域的条件语句的值,而无需事先将其保存为父作用域中的变量,在父作用域中它不再使用。
这将使我的代码更紧凑,但更易于阅读,这是一个相当主观的壮举。可能有多种方法,因此欢迎各种解决方案(最好是 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');