Vanilla Javascript算法,如何做和解释
Vanilla Javascript algorithm, how to do it and explanation
对于我的学校作业,我必须编写一个名为的纯Javascript函数
foo(c)
应该返回以下值:
foo('a') // return 'fa'
foo()('b') // return 'fob'
foo()()("t")) // return 'foot'
因此,基本上,当用字符"c"作为参数调用函数时,会返回整个值(请注意,调用foo()会在整个返回值中添加一个"o"字符,并且最终字符串返回的第一个字符总是"f"。
有人能提供一个可能的实施方案吗?理想情况下,我想自己尝试,所以也最欢迎提示和提示,以及代码中的注释。
NB:我目前最大的困难是找到一种连接调用函数的方法。
谢谢。
这里有一个带有箭头函数的递归方法:
const foo = c => {
let rec = acc => x => x === undefined ? rec(acc + "o") : foo(acc + x);
return c === undefined ? rec("o") : "f" + c;
};
foo('t'); // "ft"
foo()('t'); // "fot"
foo()()('t'); // "foot"
foo
是一个一元函数,但当它在没有任何参数的情况下被调用时,它可以处理这种情况。内部函数rec
以curried形式定义,并接受累加器作为其第一个参数,接受字符串作为其第二个参数。每当省略第二个参数时,rec
就会递归地调用自己。
function foo ( c ) {
// Initialize the result
var result = 'f';
// Call the internal foo and return the result
// Which will either be the function itself, or a string, depnding on
// whether or not a truthy argument was passed in
return foo( c );
function foo ( c ) {
// If an argument was passed in, return the result
if ( c )
return result + c;
// Otherwise append an 'o' to the result
result += 'o';
// and return the function so it can be called again
return foo;
}
}
Iven的回答激励我接受这个有趣的挑战
// ES6
const foo = (x,y='f') => x && (y + x) || (x => foo(x, y + 'o'));
foo('a'); // "fa"
foo()('b'); // "fb"
foo()()('t'); // "foot"
对于仍在使用ES5…的人
// ES5
var foo = function foo(x) {
var y = arguments.length <= 1 || arguments[1] === undefined ? 'f' : arguments[1];
return x && y + x || function (x) {
return foo(x, y + 'o');
};
};
foo('a'); // "fa"
foo()('b'); // "fb"
foo()()('t'); // "foot"
如果你不能想出像@Iven Marquardt这样的绝妙想法,那么一个闭包就可以完美地完成任务。
function Foo(){
var count = 0,
str = "";
function f(a){
if (!!a){
str = "f"+"o".repeat(count)+a;
count = 0;
return str;
}
count++;
return foo;
}
return f;
}
var foo = Foo();
foo('a') // <- 'fa'
foo()('b') // <- 'fob'
foo()()("t")) // <- 'foot'
除了我之前的答案之外,我还想单独添加一个答案,因为我不想让这个漂亮的答案被忽视。问题是,这个问题最合适的解决方案可能在于ES6默认值的一个被忽视的特性。
调用函数时,如果未提供具有默认值的参数,则应用其默认值(它不会变成"未定义")
一旦你知道了这个功能,这个问题的答案就非常简单了,只不过是一句话。
var foo = (c, o = "") => !!c ? "f"+o+c : c => foo(c, o+= "o")
foo("a"); //fa
foo()("b"); //fob
foo()()("t") //foot
相关文章:
- 你能解释一下这个阶乘函数是如何工作的吗?
- 做一个复活节彩蛋,JS动作点击5个按钮
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 有人可以向我解释一下代码的JavaScript / Ajax部分是做什么的
- Vanilla Javascript算法,如何做和解释
- 动态添加javascript事件监听器,做一些无法解释的事情
- 有人可以解释一下这段代码在做什么吗?调用 Class.create() 时实际会发生什么
- 有人请帮助解释这个javascript代码,即发生了什么以及代码在做什么
- 请任何人解释一下javascript代码,并建议我如何为一年中的每一天做if
- 有人能用通俗易懂的英语向我解释一下这些剧本在做什么吗
- 有人可以向我解释 && 在调用函数时做什么吗?
- 有人能解释一下这个正则表达式是做什么的吗?
- 奇怪的做.而行为:你能解释一下吗?
- 有人能解释一下下面的JavaScript在做什么吗
- 有人能解释一下这段代码是做什么的吗?
- 我是JavaScript新手.有人能给我解释一下这个语法是做什么的吗()()
- 有人能解释一下这个脚本是做什么的吗?
- 请解释一下这个javascript代码是做什么的
- 谁能解释一下var result=1"在这个函数中做什么
- 我试图从一群人手里抢到三根棍子.标签:解释我哪里做错了