如何在JavaScript中模拟let表达式?

如何在JavaScript中模拟let表达式?,javascript,ecmascript-6,functional-programming,let,Javascript,Ecmascript 6,Functional Programming,Let,考虑以下实施方案: const take=(n[x,…xs])=> n==0 | | x==未定义? []:[x,…取(n-1,xs)]; log(取(7[1,2,3,4,5]);//[1, 2, 3, 4, 5] log(取(3[1,2,3,4,5]);//[1, 2, 3] log(取(1,[undefined,1]);//[]在Lisp中,a只是左lambda(即an)的语法糖。例如,考虑: (let([x1] [y 2]) (+xy)) ; 这是语法糖: ((λx y) (+xy))

考虑以下实施方案:

const take=(n[x,…xs])=>
n==0 | | x==未定义?
[]:[x,…取(n-1,xs)];
log(取(7[1,2,3,4,5]);//[1, 2, 3, 4, 5]
log(取(3[1,2,3,4,5]);//[1, 2, 3]
log(取(1,[undefined,1]);//[]
在Lisp中,a只是左lambda(即an)的语法糖。例如,考虑:

(let([x1]
[y 2])
(+xy))
; 这是语法糖:
((λx y)
(+xy))
1 2)
在ES6中,我们可以使用和创建一个看起来像let表达式的IIFE,如下所示:

constz=((x=1,y=2)=>x+y)();

控制台日志(z)不要使用IIFE,只需使用具有适当名称的普通函数即可使事情更加明确:

const\u let=f=>
f();
常数collateBy=f=>xs=>
x.reduce((m,x)=>
_let((r=f(x),ys=m.get(r)| |[])=>
m、 set(r,(ys.push(x,ys))),newmap();
常数includes=t=>s=>
s、 包括(t);
xs=[“Dev”,“Jeff”,“Kalib”,“Amy”,“Gemma”];
const collation=collateBy(包括(“e”))(xs);
log(collation.get(true));

log(collation.get(false))
undefined
是一个实值,但使用它不是稀疏数组的一部分。一个真正的稀疏数组看起来像
[,1]
@NinaScholz啊,我明白了。我的印象是
[,1]
[未定义,1]
是等价的,但显然不是这样。感谢您让我知道。使用
slice
的数组
take
函数肯定很奇怪,是的:-)为什么不简单地
const take=(n,xs)=>xs.slice(0,n)< AramilRey >因为这是我为这个问题而制作的一个例子。使用默认参数值肯定是我认为的黑客::)也可以把值作为参数传递而不是使用默认参数,不是吗?然而,当您使用默认参数时,它看起来更像一个let表达式。hack只是不正确使用该语言的委婉说法。相反,您应该通过引入memonization来减少JS中对
let
表达式的需求。@Bergi它很粗糙,但我喜欢它,因为它比
(()=>{const x=1;const y=2;return x+y;})更干净(