【发布时间】:2019-10-26 05:46:05
【问题描述】:
你会怎么写这样的函数
f()()
f('it') == fit
f()('x') == fox
我有
function f(s){
return "f"+s;
}
【问题讨论】:
-
fox中的o来自哪里? -
不确定 - 他们在这里有测试用例。我以前没有见过这样调用的函数
标签: javascript
你会怎么写这样的函数
f()()
f('it') == fit
f()('x') == fox
我有
function f(s){
return "f"+s;
}
【问题讨论】:
fox 中的o 来自哪里?
标签: javascript
这是一个非常奇怪的函数,但是如果你第一次没有得到参数,你可以让你的命名函数返回一个匿名函数:
function f(s, str) {
if(typeof str === "undefined") {
str = "f"
}
if(typeof s === "undefined") {
return function(t) {
return f(t, str + "o")
}
} else {
return str + s;
}
}
【讨论】:
f()(),我相信它应该返回一个空字符串。
您只有 3 个必需的输出,并且没有解释其他行为要求。因此,最简单的方法是:
let f = arg =>
arg ? 'f' + arg : arg => arg ? 'fo' + arg : '';
console.log(f()()); // ''
console.log(f('it')); // 'fit'
console.log(f()('x')); // 'fox'
【讨论】:
您可以为多次调用该函数返回一个函数,并实现一个toString 方法来获取最终字符串。
function f(v) {
var s = 'f' + (v || 'o');
function g(v) {
s += v || 'o';
return g;
};
g.toString = function () { return s; };
return g;
}
console.log(f()()); // foo
console.log(f('it')); // fit
console.log(f()('x')); // fox
console.log(f()()('b')('a')('r')); // foobar
【讨论】:
我不仅要从您的问题中,还要从您的 cmets 中辨别出您在寻找什么。看起来每个字符串都以'f' 开头,每个空括号对都附加一个'o'。最后,一个非空括号对附加它的参数。
我实际上认为这是一个很酷的元编程挑战。
这应该可行:
let f = (str, depth=0) => str
? `f${'o'.repeat(depth)}${str}` // If given param, terminate
: str => f(str, depth + 1); // If no param, return func
// "fit"
console.log(f('it'));
// "fox"
console.log(f()('x'));
// "fortress"
console.log(f()('rtress'));
// "football"
console.log(f()()('tball'));
// "foooooool!!!"
console.log(f()()()()()()()('l!!!'));
【讨论】:
哈哈我前几天看到这个问题,我用了函数柯里化:
var f = s => s ? `f${s}` : (g=o=>e=>e?`f${o+e}`:g(o+'o')) && g('o')
console.log(f('x'))
console.log(f()()('l'))
console.log(f()()()('bar'))
【讨论】: