【问题标题】:How to use let declarations as expressions?如何使用 let 声明作为表达式?
【发布时间】:2017-10-04 22:46:04
【问题描述】:

我想使用let 表达式,但是下面的代码不起作用:

true ? (let x=1, let y=2, x+y) : (let x=3, let y=4, x-y); // SyntaxError

我该怎么做?

【问题讨论】:

  • 另一种情况,试图强制使用三元组只会导致更大的混乱。如果您需要通过箍来使用三元组,您可能应该只使用显式 if...else。
  • @Carcigenicate 中肯的建议,但像 OP 一样玩耍确实可以深入了解语言本身。

标签: javascript functional-programming expression let


【解决方案1】:

以下是一种糖...

let x = 1
console.log(x)

没有varconstlet,我们可以使用函数来绑定变量

// let x = 1; console.log(x);
(x => console.log(x)) (1)

当然,如果您也有多个变量,这也有效

(x =>
  (y => console.log(x + y))) (1) (2)

而且由于 JavaScript 函数可以有超过 1 个参数,如果需要,您可以使用 single 函数绑定多个变量

((x,y) => console.log(x + y)) (1,2)

至于你的三元表达式

true
  ? ((x,y) => console.log(x + y)) (1,2)
  : ((x,y) => console.log(x - y)) (1,2)
// 3

false
  ? ((x,y) => console.log(x + y)) (1,2)
  : ((x,y) => console.log(x - y)) (1,2)
// -1

这些都不需要任何奇特的语法或语言特性——以下内容几乎适用于我能想到的任何 JS 实现

true
  ? (function (x,y) { console.log(x + y) }) (1,2)
  : (function (x,y) { console.log(x - y) }) (1,2)
// 3

false
  ? (function (x,y) { console.log(x + y) }) (1,2)
  : (function (x,y) { console.log(x - y) }) (1,2)
// -1

【讨论】:

    【解决方案2】:

    不幸的是,Javascript 缺少 lisp 样式的 let 表达式。但是,由于有默认参数和箭头函数,我们可以模仿它们:

    const let_ = f => f();
    
    console.log(
      true ? let_((x = 1, y = 2) => x + y) : let_((x = 3, y = 4) => x - y) // 3
    );

    说实话,这有点乏味,代码也很冗长。下面的递归用例可能更有说服力:

    const let_ = f => f();
    
    const fact = n => let_(
      (aux = (n, acc) => n === 1 ? acc : aux(n - 1, acc * n)) => aux(n, 1)
    );
    
    console.log(
      fact(5) // 120
    );

    这是否是惯用的 Javascript 值得怀疑,但这是我第一次在代码中使用默认参数。

    【讨论】:

    • 为什么不 const fact = n =>(aux = (n, acc) => n === 1 ? acc : aux(n - 1, acc * n)) => aux(n , 1))());
    • 为什么不使用常规函数?
    • 哇,多么可怕又聪明的语法滥用 :-) 我想你应该部署实现 do-expression proposala transpiler
    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 2019-10-14
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多