回调,错误:不是一个函数

时间:2016-05-20 21:28:52

标签: javascript callback currying

所以我回到一些基础知识,发现我遇到了最简单的问题。我有一个回调,它给我一个错误,我怀疑这是一个悬挂的事情,但谷歌搜索,似乎无法找到我想要的。

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被提升到顶部,其值为undefined,而命名函数则完整悬挂。当我登录日志console.log(typeof f)时它返回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);

3 个答案:

答案 0 :(得分:1)

要回答您的问题,您需要查看applyFn返回的内容。它需要一个函数,并简单地返回该函数。如果你指定它返回的内容,你指定给它的变量现在只是对你最初传入的函数的引用。在这种情况下,这就是函数add,它只是将两个数字加在一起。当你调用f时,你真的在​​调用add,这意味着1.它需要两个参数和2.它将返回添加两个参数的结果,而不是另一个函数然后你可以呼叫。如果你的目标是做currying,那么你的函数需要返回另一个函数,以便可以调用它:

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

的期望

答案 1 :(得分:1)

您的代码未在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

答案 2 :(得分:0)

执行f的语法错误。 f(3)(4)应为f(3, 4)。检查它,它的工作原理。查看this jsfiddle