所以我回到一些基础知识,发现我遇到了最简单的问题。我有一个回调,它给我一个错误,我怀疑这是一个悬挂的事情,但谷歌搜索,似乎无法找到我想要的。
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应该能够使用add
或multiply
函数,所以看起来更像是这样:
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);
答案 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的这种实现应该符合您对add
和multiply
答案 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));
但另一方面,add
和multiply
- 方法没有意义,目前它们的实现方式。
我绝不赞成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