【问题标题】:Currying or closure咖喱或关闭
【发布时间】:2021-10-28 09:15:49
【问题描述】:

你好,我正在做一个 javascript 编码面试,为即将到来的面试做准备。 我有一个问题让我有点困惑。问题如下:

下面说明了什么概念?

function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

var addFive = makeAdder(5);
console.log(addFive(3));

有 4 个答案可供选择,然后是: 咖喱和 关闭

我认为这两个都是对的。我最终选择了咖喱,但我真的认为这也说明了闭包?你能解释一下为什么这没有说明闭包吗?

【问题讨论】:

  • “你能解释一下为什么这没有说明闭包吗?” - 它也与闭包有关。 makeAdder 函数返回的函数在参数x 之上有一个闭包
  • 这应该是curryingclosure...
  • 同样的例子用于解释文档中的闭包:developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
  • @decpk 我同意,但显然唯一正确的答案是柯里化:github.com/Ebazhanov/linkedin-skill-assessments-quizzes/blob/…
  • 为了安全起见,我会选择“关闭”。当然,makeAdder+curried 版本,但对于实际的“currying”,我希望看到makeAdder = curry((x, y) => x+y)

标签: javascript closures currying


【解决方案1】:

Currying 始终是闭包的语法 Sugar。它不调用函数。它只是改变它。

对于您的上述情况,这只是闭包,因为您正在使用另一个变量来存储内部函数并以不同方式执行 .像 addFive 一样是稍后调用的内部函数。

如果你想柯里化它就像我创建的下面的例子一样。 Currying 是闭包的概念,因为它的前导执行大括号可以同时帮助内部函数执行。所以在这里你不必为了调用内部函数而存储另一个变量。

根据定义,柯里化应该将 sum(a, b, c) 转换为 sum(a)(b)(c)。

function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}


console.log(makeAdder(5)(3));

【讨论】:

  • 这是令人困惑的部分,显然正确的答案是currying github.com/Ebazhanov/linkedin-skill-assessments-quizzes/blob/…
  • Currying 始终是闭包的语法糖。”我不同意。在多个帐户上。首先,它不是“语法糖”。这意味着它只是为了使事情变得更容易而引入的特定语法。但这不是特殊的语法。其次,我不认为它总是作为闭包实现。你可以拥有add = curry((x, y) => x + y),然后它会给你一个咖喱函数。根据curry 的实现,它可能依赖也可能不依赖闭包行为。
  • @kevin 这些问题似乎有点垃圾。我到了Q9,答案是错误的。其余的没有错误的答案,但也不是很好。 Q7 有与之关联的错误代码,并且与它相关的答案实际上没有意义。 Q5 出现两次。并且可以说有第二个正确答案。 Q9 没有任何正确答案。 JS 中的所有函数都是闭包。没有一种特殊的机制可以使它们成为一体。不使用父作用域变量的函数是无趣的闭包,但仍然是。
  • @kevin 哦,Q8 的答案在技术上是正确的,但可能不应该使用。有更好的方法来实现相同的功能。
  • @Yousaf A bound function exotic object 仅跟踪绑定函数 this 和任何部分分配的参数。与a regular function 相比,它确实将其定义为内部插槽[[Environment]] 的范围。所以,1. .bind() 不会形成闭包 2. 即使这样做了,它也不会关闭 curry 中的任何内容。
猜你喜欢
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2017-08-28
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多