如何使用let声明作为表达式?

时间:2017-05-06 15:20:23

标签: javascript functional-programming expression let

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:1)

不幸的是,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是值得怀疑的,但是当我第一次在我的代码中使用默认参数时,这是很明显的。

答案 1 :(得分: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个参数,所以如果需要,可以使用单个函数绑定多个变量

((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