关于链接单个函数



我遇到了一个问题,我们应该编写一个JS函数"func",它的行为假设如下所示

func("world") --> returns --> hiworld
func()("world") --> returns --> hiiworld
func()()("world") --> returns --> hiiiworld
func()()()("world") --> returns --> hiiiiworld
func()()()()("world") --> returns --> hiiiiiworld
func()()()()()("world") --> returns --> hiiiiiiworld

因此,它必须是可调用的,我们需要在hiworld之间添加"i",具体取决于它被调用的次数。我能够编写如下代码:-

function parent () {
let mid = '' 
function func(param) {
if(param) {
let str = 'hi' + mid + param
mid = ''
return str
}

mid += 'i'

return func
}

return func
}

let func = parent()

但我无法满足测试用例:-

func() --> returns func
func()("world") --> returns --> hiiworld

我们不需要再次定义func变量。基本上,我们需要一种方法来跟踪在链接机制中调用func的次数。新呼叫应从开始计数。有人能提出一些关于我们如何实现这种行为的想法吗?

这是您需要的代码,请参阅下面的解释。

const func = (param = "") => {
const inner = (word = "") => {
if (word.length === 0) {
inc += 1;
return inner;
}
return "hi" + ("i".repeat(inc)) + word;
}
if (param.length !== 0) {
return "hiworld";
}
let inc = 1;
return inner;
}

下面的这个替代方案也会给出相同的输出

const func = (param="") => {
if (param.length !== 0) {
return "hiworld";
}
let inc = 1;
const inner = (word="") => {
if (word.length === 0) {
inc += 1;            
return inner;
}
return "hi" + ("i".repeat(inc)) + word;
}

return inner;
}
  • func("world"):我们将从第1行执行,并在的第12行停止。并且由于param"世界我们只会返回"strong>";hiworld
  • func()("world"):现在没有传入param(调用func()的第一部分(,因此将跳过1012的行,innec.inc将在第14行上为1,然后我们将inner函数返回给func()。既然内部现在被返回到CCD_ 7并用参数">"调用;世界。即func()将返回inner,我们现在说inner("world")(这相当于第一部分func() == inner)func()("world")。这意味着单词"世界">,因为它是internal的参数。第3行到第6行将不会执行,所以我们返回"hiiworld"inner.inc``"i"意味着复制"i"inner.inc的次数,目前只有一次
  • func()()("world")第一部分func()返回inner(inner.inc当前为1(。2nd部分func()()返回inner,然后用空参数调用inner。即将是一个空字符串,第3行至第6行现在将被执行,将internal.inc递增至2,并再次返回inner,同时忽略行7第三个部分:由于第二个nternal.inc并返回了inner,因此我们使用返回的inner并调用参数";世界。哪个单词现在将是";世界的第3行至第6行现在被跳过,第7行

这种情况一直持续下去。其想法是,只要我们不提供参数internal.inc就会在第4行继续增加。当我们提供参数时,第7行现在被执行,我们就完成了。

如果需要,这里是Python的等价

def func(param=""):
if param:
return "hiworld"
def inner(word=""):
if word:
inner.inc += 1
return inner
return "hi" + inner.inc * "i" + word

inner.inc = 1
return inner

最新更新