我是函数式编程的新手,我很难理解以下函数的实际情况。
const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))
据我所知,我实际上是将函数传递给函数someFnc。但是如何将函数arg作为arg(...)自我调用(在我的示例中使用字符串的参数)? 我对这个概念感到困惑。
答案 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
变量只是值的名称。函数是您可以在应用之后放置()
的值,可选地使用其中的参数。