Javascript高阶函数

时间:2017-08-08 18:09:26

标签: javascript function lambda

我是函数式编程的新手,我很难理解以下函数的实际情况。

const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))

据我所知,我实际上是将函数传递给函数someFnc。但是如何将函数arg作为arg(...)自我调用(在我的示例中使用字符串的参数)? 我对这个概念感到困惑。

2 个答案:

答案 0 :(得分:3)

如果你把它分开,你可以看到发生了什么:

function someFunction(fn) {
    fn('hello')
}

function logFunction(msg) {
    console.log(msg)
}

someFunction(logFunction)

基本上,someFunction接受一个应该是函数的参数(fn)。

然后传递一个字符串("hello")作为该函数的参数(fn('hello'))。

someFunction然后执行它收到的函数,因此它正在执行logFunction('hello')

logFunction接受一个字符串参数,控制台记录它(console.log('hello')

箭头函数((arg) =>)是撰写function(arg) { }的简写。

答案 1 :(得分:0)

const someFnc = arg => arg("You can print that string :)");

只是以匿名方式制作:

function someFnc (arg) {
  arg("You can print that string :)");
}

您定义的其他匿名函数:

msg => console.log(msg)

这会产生一个带有msg的anoynous函数,并将其用于调用console.log。因为它只是用第一个参数调用console.log,所以它是一个什么都不做的包装器。您确实可以将其替换为console.log

someFnc(console.log)

现在使用替换规则,我们可以用函数体替换函数调用,并为绑定变量替换参数,因此:

arg("You can print that string :)");        // replace arg with console.log
// ===
console.log("You can print that string :)");

现在,当您在JavaScript中编写裸字时,如parseInt,它就是一个变量。它评估一个函数。因此parseInt("10"); // ==> 10。在函数体中arg是一个变量,它获取对象log上属性console的值。它就像parseInt一样。变量是值,函数也是值。

当您将值传递给函数时,它将绑定到其定义中的变量。它甚至可以影响现有的功能:

((parseInt, value) => parseInt(value))(Number, "10"); 
// => 10

所以规则是用参数替换绑定变量,因此它确实是:

Numer("10"); //=> 10

变量只是值的名称。函数是您可以在应用之后放置()的值,可选地使用其中的参数。