Javascript ES6函数帮助-函数返回函数

Javascript ES6函数帮助-函数返回函数,javascript,ecmascript-6,Javascript,Ecmascript 6,我对ES6很陌生 试着通过一些测试来学习 请帮助我在这方面的什么应该是实现通过测试 //依赖项: const expect=require('chai')。expect; //实施这一点: 功能b(x){ //返回“b”+x; //返回(x)=>“bo”+x; } //单元测试: 描述(“执行功能b”,功能(){ 它(“应适用于以下情况”,函数(){ log(b()(“m”); 期望(b(“m”)等于(bm”); 期望(b)等于(bom); 期望(b()()(“m”)等于(“繁荣”); 期望(

我对ES6很陌生

试着通过一些测试来学习

请帮助我在这方面的什么应该是实现通过测试

//依赖项:
const expect=require('chai')。expect;
//实施这一点:
功能b(x){
//返回“b”+x;
//返回(x)=>“bo”+x;
}
//单元测试:
描述(“执行功能b”,功能(){
它(“应适用于以下情况”,函数(){
log(b()(“m”);
期望(b(“m”)等于(bm”);
期望(b)等于(bom);
期望(b()()(“m”)等于(“繁荣”);
期望(b)等于(booom);
期望(b)等于(boooot);
});

});这是可能的,但有点奇怪,在现实生活中我永远不会做这样的事情

通常,返回函数的函数称为“二阶”函数。返回函数的函数是“三阶”函数。您要做的是编写一个函数,它的顺序根据参数的不同而不同,这对于读取和维护来说非常混乱

话虽如此,javascript对返回类型并不挑剔,所以您可以这样做。下面是我要使用的代码(使用ES6默认变量和递归)

函数b(最后一个字母,前缀=“b”){ 如果(最后一封信){ //如果我们要结束这条链,请返回所有到目前为止最后一个字母在末尾的内容 返回前缀+最后一个字母; } //如果不是,则返回前缀稍长的函数版本 return lastLetter=>b(lastLetter,前缀+o); } 控制台日志(b(“m”); log(b()(“m”); log(b()()(“m”);
log(b()(“t”)显然,
b
必须在未向其传递任何参数的情况下返回函数。此函数的作用方式相同:如果没有参数传递给它,它将返回自身。此外,我们必须跟踪函数被调用的次数

以下解决方案创建了一个内部函数,如果其参数为falsy,则该函数将递增计数,否则它将创建一个由
“b”
“o”
组成的字符串,重复次数与计数指定的次数和参数值相同:

const b=v=>{
设n=0;//这是我们的计数器
常数f=e=>{
如果(e!==未定义){
//传递了参数,请返回正确的值
返回“b”+“o”。重复(n)+e;
}
//未传递任何参数,请递增计数器并返回函数
n+=1;
返回f;
};
//第一次使用初始值调用函数
返回f(v);
};
控制台日志(b('m'));
log(b()('m'));
log(b()()('m');
log(b()('m');

log(b()('t')您可以使用闭包和命名函数表达式,请参见注释。我不喜欢重复的线条,但用这种图案无法避免

功能b(x){
//在第一次呼叫时,设置前缀
变量前缀='b';
//如果第一次呼叫时提供x,则提前结束
如果(x)返回前缀+x;
//否则,返回一个可以链接的函数
返回函数foo(x){
前缀+='o';
如果(x)返回前缀+x;
返回foo;
} 
}
控制台日志(b('m'));
log(b()('m'));
log(b()()('m');
log(b()('m');

log(b()('t'))我们不鼓励那些只是断章取义地陈述问题,并期望社区解决问题的帖子。假设你自己试图解决它,但却陷入了困境,如果你写下自己的想法和你想不出来的东西,可能会有所帮助。这肯定会给你的帖子带来更多的答案。在那之前,这个问题将被投票表决为关闭/否决。我考虑过这一点,但不喜欢用第二个参数,而是使用了关闭。是的,我同意,这也是我强烈反对这种方法的原因之一!“不过它确实通过了测试。@DuncanThacker你的解决方案也有同样的问题:P甚至比这个问题还要多一些。”。我想知道你为什么强烈反对这种做法?因为这种方法比你的方法好。对不起,我不太清楚-问题是要努力完成一些我在现实生活中从来没有尝试过的事情。你(和我)的答案正确地回答了这个问题,我并没有试图把你的答案写下来,