回调,错误:不是函数
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 应该能够使用 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);
您执行 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 的实现应该可以满足您对 add
和 multiply
的期望
您的代码不是在 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
所以我回到了一些基础知识,发现我在处理最简单的事情时遇到了麻烦。我有一个向我抛出错误的回调,我怀疑这是一个提升的东西,但一直在谷歌搜索,似乎找不到我要找的东西。
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 应该能够使用 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);
您执行 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 的实现应该可以满足您对 add
和 multiply
您的代码不是在 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