不理解高阶函数(使用javascript的问题示例)
目前我正在学习Javascript基础知识,尤其是高阶函数。我读过很多文章,也看过很多视频,人们在视频中解释了高阶函数的基本定义,并演示了高阶函数的最基本构造。然而,当我遇到实际问题时,我迷失了方向。下面是一个例子(这只是为了我个人的学习,不是为了成绩或工作): 编写一个maybe函数,给定一个谓词(返回布尔值的函数)和任何其他函数,仅当前者返回true时调用后者:maybe(x=>x>100,myFn)。如果谓词返回true,则应将x的值传递给myFn。如果谓词返回false,则x应原封不动地返回 我不明白如何将x的值从一个函数传递到另一个函数 除了谓词函数和回调函数之外,我还为maybe添加了一个数字参数来解决这个问题。但是,提示中只指定了两个参数,所以我想我没有正确地执行。以下是我所做的:不理解高阶函数(使用javascript的问题示例),javascript,callback,higher-order-functions,Javascript,Callback,Higher Order Functions,目前我正在学习Javascript基础知识,尤其是高阶函数。我读过很多文章,也看过很多视频,人们在视频中解释了高阶函数的基本定义,并演示了高阶函数的最基本构造。然而,当我遇到实际问题时,我迷失了方向。下面是一个例子(这只是为了我个人的学习,不是为了成绩或工作): 编写一个maybe函数,给定一个谓词(返回布尔值的函数)和任何其他函数,仅当前者返回true时调用后者:maybe(x=>x>100,myFn)。如果谓词返回true,则应将x的值传递给myFn。如果谓词返回false,则x应原封不动地
//predicate (evaluates to a boolean)
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);
EDIT:如下所示,现在可能只能接受两个参数(谓词和回调),因为它现在返回一个参数为number
的函数。这就是我一直在寻找的想法
function maybe(predicate, callback) {
return function (number) {
if (predicate(number) === true) {
return callback(number);
} else {
return number;
}
}
}
这在技术上是不可能的x
被锁定在谓词的范围之外。你不可能从这个函数中提取它
除此之外,正如您在代码中正确假设的那样,我们在逻辑上需要将x
与谓词
和回调
进行通信。否则,可能
有什么意义
从那时起,您的解决方案是极少数可能的解决方案之一
你可以用咖喱来“装饰”它。这个想法与代码中的想法完全相同,但如果这样做,您将能够使用2个参数精确地调用最终函数
const setMaybeBase => x => (predicate, callback) => predicate(x) ? callback(x) : x;
// use it later this way
const maybe42 = setMaybeBase(42);
maybe42(yourFn, yourFnTwo);
除非传递给setMaybeBase
的参数是一个将要处理的复杂对象,否则这是一个巨大的杀伤力
或者,也可以使用函数获取x
然而,始终记住,最简单的解决方案是最好的
下面是一个现实世界中的maybe函数示例,直接取自:
我不明白。你的代码看起来不错。问题出在哪里?Maaz,提示只指定了2个参数(谓词和回调)。是的,我的测试通过了,但我担心在不添加数字参数的情况下解决这个问题……我不知道在这种情况下如何解决。你打算如何首先将数字传递给谓词?谢谢,我意识到我需要立即返回一个以数字为参数的函数,而不是在maybe的参数列表中包含数字。谢谢您的解释!我意识到我需要立即返回一个以数字为参数的函数,而不是在maybe的参数列表中包含数字。在此之前,我没有意识到将值从一个函数传递到另一个函数的方法是通过返回一个新函数(从顶级函数的参数传递到内部函数的参数)。现在清楚多了。
function maybeCallback(cb) {
if (typeof cb === 'function')
return cb;
throw new ERR_INVALID_CALLBACK(cb);
}