Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:如何在表达式中多次获取和使用值_Javascript_Expression_Variable Assignment - Fatal编程技术网

JavaScript:如何在表达式中多次获取和使用值

JavaScript:如何在表达式中多次获取和使用值,javascript,expression,variable-assignment,Javascript,Expression,Variable Assignment,我经常发现自己处于这样一种情况:一个值后跟一个表达式,该表达式多次使用该值,或者同时使用该表达式并返回它。例如: const errorCode = getErrorCode(); return new Error(`Error ${errorCode}: ${getErrorMessage(errorCode)}`); const foo = getFoo(); return [getBar(foo), getBaz(foo)]; // Assume that I cannot make

我经常发现自己处于这样一种情况:一个值后跟一个表达式,该表达式多次使用该值,或者同时使用该表达式并返回它。例如:

const errorCode = getErrorCode();
return new Error(`Error ${errorCode}: ${getErrorMessage(errorCode)}`);

const foo = getFoo();
return [getBar(foo), getBaz(foo)];  // Assume that I cannot make a function getBarAndBaz(foo)

const result = getResultOrNull();
return result
  ? result
  : getAlternative();
我希望能够避免将值赋给变量,以便将它们转换为一行程序

  • 是否有一种或多种技术可以用来实现这一点
  • 有没有一个术语来描述我要做的事情,或者是其他编程语言用来实现这一点的技术的名称
如果我假设它的语法是什么样的,我可以看到它类似于以下之一:

return new Error(`Error ${errorCode}: ${getErrorMessage(errorCode)}`), where errorCode = getErrorCode();

return (getFoo(), getBar()) -> { foo: $1, bar: $2, baz: getBaz($1, $2)};
这两种想法似乎与立即调用函数表达式(IIFE)相似,只是参数是经过计算的,而不是传入的。因此,我可以使用具有默认值或闭包的IIFE:

(
  (foo = getFoo(), bar = getBar()) => ({ foo, bar, baz: getBaz(foo, bar)})
)()

(
  () => {
    const foo = getFoo();
    const bar = getBar();
    return (
      () => ({ foo, bar, baz: getBaz(foo, bar) })
    )();
  }
)()
然而,这两者似乎都有点混乱

我可以使用do表达式():


但是,do表达式还不是JavaScript的一部分,如果能找到一个真正的单行程序的替代方案,那就太好了。

有点像单行程序,尽管很难看:

function getFoo() {
  return 'FOO';
}
function getBar() {
  return 'BAR';
}
function getBaz(...args) {
  return args;
}

let result;

if (1) { let foo = getFoo(); let bar = getBar(); result = { foo, bar, baz: getBaz(foo, bar) };}

console.log(result);

// { foo: 'FOO', bar: 'BAR', baz: [ 'FOO', 'BAR' ] }

有点像一条线,虽然很难看:

function getFoo() {
  return 'FOO';
}
function getBar() {
  return 'BAR';
}
function getBaz(...args) {
  return args;
}

let result;

if (1) { let foo = getFoo(); let bar = getBar(); result = { foo, bar, baz: getBaz(foo, bar) };}

console.log(result);

// { foo: 'FOO', bar: 'BAR', baz: [ 'FOO', 'BAR' ] }

您提出这种解决方案的动机是什么?这只是为了方便,还是希望将变量名保留在当前命名空间之外?只是为了方便。特别是在代码更干净或更容易使用表达式/一行程序编写的情况下。例如,如果每个步骤都是表达式/单行,则使用Lodash的链函数组合多个步骤更容易。另一个例子是像map这样的高阶函数,如果函数是一行的,那么它通常更容易阅读。你提出这种解决方案的动机是什么?这只是为了方便,还是希望将变量名保留在当前命名空间之外?只是为了方便。特别是在代码更干净或更容易使用表达式/一行程序编写的情况下。例如,如果每个步骤都是表达式/单行,则使用Lodash的链函数组合多个步骤更容易。另一个例子是像map这样的高阶函数,如果函数是单线性函数,那么它通常更容易读取。