Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript面试测试失败_Javascript_Function - Fatal编程技术网

JavaScript面试测试失败

JavaScript面试测试失败,javascript,function,Javascript,Function,我最近通过了一次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

我最近通过了一次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;
  });
});
有人能帮你回答这个问题,并解释一下你可能如何/为什么以及何时使用它吗?

我认为问题的“棘手”部分与方法调用中的
()
链接有关<代码>添加(2,8)(5)与
添加(2,8,5)
不同。对于第一次调用(因此,在练习中),您的
add
方法应该返回一个函数,而不是加法的结果


请参阅此处的更多信息:

在本作业中,希望您了解函数的部分应用。假设您有一个具有两个参数的函数:

> function plus(a, b) { return a + b }
> plus(1,5)
6
现在,如果你用更少的参数来调用它会发生什么

> plus(1)
NaN
这并不是特别有用——Javascript只是将默认的
undefined
用于第二个参数,函数中断。一个更聪明的处理方法是“冻结”第一个参数,当第二个参数出现时,对两个参数执行操作。然后,
加上(1)(5)
将返回6。为此,我们重写
plus
,使其返回另一个已包含第一个参数的函数,并接受第二个参数:

> function plus(a) { return function(b) { return a + b } }
> plus(1)(5)
6
这种“冻结”函数参数的过程称为“部分应用程序”。使用较少参数调用时自动执行此操作的函数是“curried”函数。在javascript中,它们没有被广泛使用,但大多数函数式语言都支持它们

你的作业的实际解决方案稍微复杂一些,我把它留作练习(看看是否有帮助)

将函数
fn
传递到
curry
以创建一个函数,该函数在被调用时创建一个函数,该函数将随时间累积传递给它的参数,并返回自身。通过调用从
curry
返回的函数所附带的
value
方法,可以将累积参数应用于
fn

在这种情况下,您可以创建一个add函数,该函数可添加任意数量的参数,并使其接收累积的参数


就我个人而言,我从来没有机会使用这种技术。但显然,这是一个很好的面试问题,至于“如何、为什么和何时”可能会被录用。

这就是所谓的“讨好”。谢谢你的帮助!
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;
  });
});