目前,我正在学习Javascript基础知识,尤其是高阶函数。我读了很多文章,看了很多视频,人们在其中解释了基本定义并演示了高阶函数的最基本构造。但是,当我遇到实际问题时,我会迷路。这是一个示例(这仅用于我的个人学习,不用于成绩或工作):
编写一个可能的函数,给定一个谓词(一个返回布尔值的函数)和任何其他函数,如果前者返回true,则仅调用后者:maybey(x => x> 100,myFn)。如果谓词返回true,则x的值应传递给myFn。如果谓词返回false,则x应该保持不变。
我不明白如何将x的值从一个函数传递给另一个函数...
除了谓词函数和回调函数外,我还通过向也许添加一个数字参数来解决此问题。但是,提示中仅指定了两个参数,因此我想我没有正确地执行它。这是我所做的:
const notZero = function(x) {
//console.log('predicate runs!');
return x !== 0;
}
//callback (does something within the main function)
const plusOne = function(x) {
//console.log('callback runs!');
return x + 1;
}
//checking if my predicate works
//test(notZero(1), true); // => test passed!
//another callback
const myFn = function(x) {
return x - 100;
}
//main function
function maybe(number, predicate, callback) {
if (predicate(number) === true) {
//console.log('predicate === true');
//console.log(callback(number));
return callback(number);
} else {
return number;
}
}
test(maybe(1, notZero, plusOne), 2);
test(maybe(0, notZero, plusOne), 0);
test(maybe(101, x => x > 100, myFn), 1);
test(maybe(99, x => x > 100, myFn), 99);```
从技术上讲是不可能的。 x
在predicate
的范围内被锁定在世界之外。您无法从此函数中提取它。
此外,正如您在代码中正确假设的那样,我们在逻辑上需要将x
与predicate
和callback
进行通信。否则,maybe
到底有什么意义?
自那时以来,您的解决方案是极少数可能的解决方案之一。
您可以通过“ curry”更好地“装饰”它。这个想法与代码中的想法完全相同,但是如果您这样做的话,您将可以使用2个参数精确地调用最终函数。
const setMaybeBase => x => (predicate, callback) => predicate(x) ? callback(x) : x;
// use it later this way
const maybe = setMaybeBase(42);
maybe(yourfFn, yourFnTwo);
除非您传递给setMaybeBase
的参数例如是您要使用的复杂对象,否则这是huge的过度杀伤力。
或者,您可能会疯狂并使用函数来get x
。
尽管如此,请始终记住,最简单的解决方案是最好的解决方案。
这是直接从node.js repo中获取的函数的真实示例:
function maybeCallback(cb) {
if (typeof cb === 'function')
return cb;
throw new ERR_INVALID_CALLBACK(cb);
}