我最近未通过JavaScript面试测试,无法从雇主那里得到一些答案的反馈,特别是一个问题。测试是使用Mocha测试设置的,你必须编写代码才能通过。测试是:
describe('Step 5', function() {
it('add(2,8)(5).value() => 15', function() {
add(2,8)(5).value()
.should.be.exactly(15).and.be.a.Number;
});
it('add(3, 3, 5)(4)(3, 2).value() => 20', function() {
add(3, 3, 5)(4)(3, 2).value()
.should.be.exactly(20).and.be.a.Number;
});
});
有人可以帮助解答并解释如何/为何以及可能何时使用此答案?
答案 0 :(得分:4)
describe('Step 5', function() {
var curry = function (fn) {
return function () {
var args = [],
accumulate = function accumulate() {
args = args.concat(Array.prototype.slice.call(arguments));
return accumulate;
};
accumulate.value = function () {
return fn.apply(null, args);
};
accumulate.apply(null, arguments);
return accumulate;
};
},
add = curry(function () {
return Array.prototype.reduce.call(arguments, function (total, number) {
return total + number;
}, 0);
});
it('add(2,8)(5).value() => 15', function() {
add(2,8)(5).value()
.should.be.exactly(15).and.be.a.Number;
});
it('add(3, 3, 5)(4)(3, 2).value() => 20', function() {
add(3, 3, 5)(4)(3, 2).value()
.should.be.exactly(20).and.be.a.Number;
});
});
将函数fn
传递给curry
以创建一个函数,该函数在调用时创建一个函数,该函数累积随时间传递给它的参数,并返回自身。您可以通过调用从fn
返回的函数返回的函数附加的value
方法将累积的参数应用于curry
。
在这种情况下,您可以创建一个add
函数,该函数可以累加任意数量的参数,并且可以接收累积的参数。
我个人从未有机会使用这种技术。但显然这是一个很好的面试问题,因此对于"如何,为什么以及何时:"可能会被录用。
答案 1 :(得分:3)
在此作业中,您需要了解部分应用程序的功能。假设您有一个带有两个参数的函数:
> function plus(a, b) { return a + b }
> plus(1,5)
6
现在,如果用较少的参数调用它会发生什么?
> plus(1)
NaN
这并不是特别有用 - Javascript只是使用默认的undefined
作为第二个参数,并且函数会中断。一个更聪明的方法就是"冻结"第一个参数,当第二个参数出现时,对两者执行操作。然后,plus(1)(5)
将返回6.为此,我们重写plus
,以便它返回另一个已包含第一个参数并接受第二个参数的函数:
> function plus(a) { return function(b) { return a + b } }
> plus(1)(5)
6
这个"冷冻"函数参数被称为"部分应用程序"。使用较少参数调用时自动执行此操作的函数是" curried"功能。在javascript中,它们没有被广泛使用,但是大多数函数式语言都支持它们。
您的作业的实际解决方案稍微复杂一些,我将其作为练习(请参阅this answer是否有帮助)。
答案 2 :(得分:1)
我认为"棘手"问题的一部分与方法调用中()
的链接有关。 add(2, 8)(5)
与add(2, 8, 5)
不同。对于第一次调用(因此,在您的练习中),您的add
方法应该返回一个函数,而不是添加的结果。
在此处查看更多内容:Function calling in Javascript with double brackets