我该如何编写一个计算mod(3)(9)的函数?

11

我参加了一次面试,除了这个问题外,我回答了所有的问题。

前面的第一个问题是如何编写一个函数使得mod(3,9)返回0。

好的,很简单:

function mod(a,b){
    return b%a;
}

之后的问题是如何编写函数mod(3)(9)使其返回0?

我被难住了...


4
返回一个函数。请查看高阶函数和柯里化的教程。我认为你是指 mod(3)(9) - elclanrs
3
mod((3)(9))不是JavaScript中的有效语法,因此无法编写一个函数来让这样的调用返回0。请注意,这里的mod可能表示取模运算符。 - zerkms
1
这似乎是一个相当愚蠢的面试问题。 - Ryan
3
对于初级开发者来说,@self 很不错,可以检查他们是否掌握了语法基础。 - zerkms
1
我只是想感谢大家。Stackoverflow太神奇了。我希望我能接受所有的答案。在Google中不知道正确的术语进行搜索,导致我无法找到关于“mod(3)(9)”的问题的答案。现在我知道我需要学习“高阶函数”和“柯里化”。我以前甚至没有听说过柯里化。 - sjmartin
显示剩余3条评论
3个回答

18

你编写一个返回闭包的函数。

function mod(a) {
  return function(b) {
    return b % a;
  }
}

alert(mod(3)(9));

alert表达式是以下简写:

var tempfun = mod(3);
alert(tempfun(9));

当你调用mod(3)时,它会返回一个函数,该函数接受一个参数b,并使用保存的绑定a中包含的3执行模运算。然后我们可以像使用任何其他函数一样使用它:我们可以将其分配给变量,然后将其作为函数调用,或者我们可以直接在其后加上另一对括号来调用它。

1
我正在进一步研究柯里化,但示例都太深奥了。我想要理解这个简单示例中到底发生了什么。我知道这是一个返回函数的函数。但我想要理解被调用的函数是如何工作的。mod(3)(9)。我将其解读为参数是"3)(9",因为参数应该被括号包裹。我知道我的想法是错误的。那么它是先执行mod(3),返回函数(b),然后9以某种方式作为b传递进去吗?(这是怎么发生的)。然后function(9)返回9%3...续在下一条评论中。 - sjmartin
我脑海中缺失的部分是正确阅读语法。参数真的不是“3)(9”,那是什么?链式函数?mod(3)然后mod(9)?9如何变成b?谢谢。 - sjmartin
2
var x = mod(3)(9) 的意思是 var f = mod(3); var x = f(3); - Barmar
谢谢,这正是让我头脑中有所欠缺的部分。非常感谢! - sjmartin
5
你是说 var f = mod(3); var x = f(9); 吗? - Drazen Bjelovuk
1
是的,在答案中得到了正确的结果。 - Barmar

11

首先,仔细看一下这个结构的用法:

mod(3)(9);

您可以将其分为两个步骤:

var fn = mod(3);
fn(9);

从这里可以明显看出,mod(3)单独必须返回一个新函数,以便稍后可以再次调用。这个新函数需要保留第一次调用时传入的值。这是关键部分:应该将该值存储在闭包中(由于闭包的本质,它会自动存储):

function mod(x) {
    return function(y) {
        return y % x;
    };
}

以下是"闭包"一词的良好解释。如果有人问你(例如面试中),你可以说:闭包是具有其最初创建范围的函数。因此,在上面的函数中,新的内部函数始终具有对外部函数参数x的内部访问。


2
您可以使用返回另一个函数的函数。
function mod(a) {
    return function(b) {
        return b % a;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接