回调,错误:不是函数

callback, err: is not a function

所以我回到了一些基础知识,发现我在处理最简单的事情时遇到了麻烦。我有一个向我抛出错误的回调,我怀疑这是一个提升的东西,但一直在谷歌搜索,似乎找不到我要找的东西。

function add (a,b){return a+b;}
function multiply (a,b){return a*b;}


function applyFn(callback) {
    return callback;
};

var f = applyFn(add);

console.log(f); //logs => function add(a,b){return a+b;}

f(3)(4); // returns => Uncaught TypeError: f(...) is not a function(…)

我知道 var f 被提升到顶部并带有未定义的值,而命名函数则原封不动地提升。当我控制台记录 console.log(typeof f) 它 returns function - 所以我对发生的事情有点困惑......我是在正确的轨道上,还是完全不同的问题?

编辑: 为了更清楚起见,applyFn 应该能够使用 addmultiply 函数,因此它看起来更像这样:

function add (a,b){return a+b;}
function multiply (a,b){return a*b;}

//I needed to write this function, but nothing else
function applyFn(callback) {
    return function(){};
};

var f = applyFn(add);
var x = applyFn(multiply)

f(3)(4);
x(6)(8);

您执行 f 的语法错误。 f(3)(4) 应该是 f(3, 4)。检查它并且它有效。检查 this jsfiddle

要回答您的问题,您需要查看 applyFn return 的内容。它接受一个函数,并且简单地 returns 这个函数。如果你分配它 returns,你分配给的变量现在只是对你最初传入的函数的引用。在这种情况下,这就是函数 add 并且它只是将两个数字加在一起.当您调用 f 时,您实际上是在调用 add,这意味着 1. 它需要两个参数,并且 2. 它会 return 将这两个参数相加的结果,而不是另一个函数然后你可以打电话。如果您的目标是柯里化,那么您的函数需要 return 另一个函数,以便它可以被调用:

function adder(num1) {
  return function (num2) {
    return num1 + num2;
  };
}

adder(2)(3);

以下是我认为您正在寻找的内容:

function applyFn(func) {
  return function (x) {
    return function (y) {
      return func(x, y);
    };
  };
}

这个 applyFn 的实现应该可以满足您对 addmultiply

的期望

您的代码不是在 f(3) 处失败,而是在第二次调用时失败。 f(3) 不是函数,因此 f(3)(4) 失败。
applyFn 应该更像这样:

var applyFn = fn => a => b => fn(a,b);
//aka.
function applyFn(fn){
    return function(a){
        return function(b){
            return fn(a, b);
        }
    }
}

但这是一个非常有限的实现,因为它只适用于恰好有两个参数的函数。更好的是更动态的东西,比如:

function _curry(n, f, a){
    var c = function(...args){
        var b = a.concat(args);
        return b.length < n? _curry(n, f, b): f.apply(this, b);
    }
    Object.defineProperty(c, "length", { configurable: true, value: Math.max(0, n-a.length) });
    return c;
}

function curry(n, f, a){
    if(typeof n === "function") a=f, f=n, n=f.length;
    return _curry(n, f, Array.from(Object(a)));
}

var add = curry(function(a, b){ return a + b });

console.log(add, add(3), add(3)(4), add(3, 4));

但另一方面,addmultiply 方法没有意义,目前的实施方式。
我永远不会喜欢 add(foo)(bar) 甚至 add(foo, bar) 而不是 foo + bar.

它们唯一有意义的地方是在这样的上下文中:

arr.map( add(3) );
//or
promise.then( add(3) );

那么为什么不直接将它们实现为

var add = b => a => a+b;
var multiply = b => a => a*b;

并跳过 applyFn 的部分?

//why b=>a instead of a=>b? consistency:
var subtract = b => a => a-b;
//so that subtract(3) also does exactly what you would think it does