不了解高阶函数(使用JavaScript的问题示例)

问题描述 投票:0回答:1

目前,我正在学习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);```
javascript callback higher-order-functions
1个回答
0
投票

从技术上讲是不可能的。 xpredicate的范围内被锁定在世界之外。您无法从此函数中提取它。

此外,正如您在代码中正确假设的那样,我们在逻辑上需要将xpredicatecallback进行通信。否则,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);

}
© www.soinside.com 2019 - 2024. All rights reserved.