【问题标题】:Regarding chaining single function关于链接单个功能
【发布时间】:2021-01-14 03:17:36
【问题描述】:

我遇到了一个问题,我们希望编写一个 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 时调用的次数。新呼叫应从开始计算。任何人都可以就我们如何实现这种行为提出一些想法吗?

【问题讨论】:

  • func() 的预期输出是什么?
  • 如果函数的最后一个参数是字符串,它必须是字符串。对于没有参数,它只能是那个函数
  • 查看@JohnOyegbite 的答案,我很确定它非常适合您的需求

标签: javascript closures method-chaining


【解决方案1】:

这是您需要的代码,请参阅下面的说明。

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"world" 我们只返回 "hiworld"
  • func()("world"):现在参数没有传入(调用的第一部分func()),所以第 1012 行将被跳过, innec.inc 将是 1line 14 然后我们将 inner 函数返回到 func()。现在 inner 现在返回到 func() 并使用参数 "world" 调用。 即func()将返回inner,我们现在说inner("world")(这相当于func()("world"),其中第一部分func() == inner)。这意味着word“世界” 因为它是 inner 的参数。第 3 到 6 行不会被执行,所以我们返回 "hiiworld"inner.inc``"i" 表示重复 "i" @ 987654338@ 次数,目前只有一次。
  • func()()("world")1st 部分func() 返回innerinner.inc 当前为1)。 2nd 部分func()() 返回inner,然后使用空参数调用inner。即 word 将是一个空字符串,并且现在将执行 第 3 行到第 6 行,将 inner.inc 递增到 2并再次返回 inner,同样忽略 第 7 行3rd 部分:由于 2nd 部分增加了 inner.inc 并且还返回了inner,那么我们使用返回的inner 和在其上调用参数 "world"word 现在将是 "world" 并且 第 3 到 6 行 现在被跳过并且 第 7 行 返回 @987654350 @。请注意,inner.inc 现在是 2

这样一直持续下去.. 只要我们不提供参数 inner.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2021-07-01
    • 2022-01-07
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多