我是功能编程的新手,我很难理解以下功能的实际情况。Javascript高级功能
const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))
从我能理解的是,我实际上将函数传递给函数someFnc。但是,函数arg怎么可以自我调用为arg(...)(在我的例子中是一个字符串参数)? 我真的很困惑这个概念。
我是功能编程的新手,我很难理解以下功能的实际情况。Javascript高级功能
const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))
从我能理解的是,我实际上将函数传递给函数someFnc。但是,函数arg怎么可以自我调用为arg(...)(在我的例子中是一个字符串参数)? 我真的很困惑这个概念。
如果你打破它拆开,你可以看到这是怎么回事:
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) { }
的简写。
const someFnc = arg => arg("You can print that string :)");
仅仅是让匿名的方式:
function someFnc (arg) {
arg("You can print that string :)");
}
您定义的其他匿名函数:
msg => console.log(msg)
这使得anoynous函数,它msg
,它使用一个呼叫到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
中是一个变量,它获取对象console
上的属性log
的值。它是一个像parseInt
一样的功能。变量是值,函数也是值。
当您将值传递给函数时,它将绑定到定义中的变量。它甚至可以阴影现有的其他功能:
((parseInt, value) => parseInt(value))(Number, "10");
// => 10
这样,规则与参数替换约束变量,因此它是真的:
Numer("10"); //=> 10
变量仅供值的名称。一个函数是一个值,你可以在()
之后应用,可选地包含参数。
_“只是匿名的方式”_ - 从ES 2015开始,上面代码片段中的函数将具有[推断的函数名称](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Function/name#Inferred_function_names)'someFnc'。 – Xufox
@Xufox是的,那是真的。它使调试更容易,分析器从最近的绑定中修饰函数对象,但分配的表达式使得匿名函数成为可能。 IMO'((fun => fun.name)(()=> 1)''也可以返回'fun',但它不会。 – Sylwester
不是msg => console.log(msg)一个lambda函数不是包装器? – JtR
'arg'不是自我调用的。调用在'someFnc'的函数体中('arg(“您可以打印该字符串:)”)')。 – Xufox
我不确定你的意思是“自我激励”。 'someFnc'调用它在执行时声明为参数的函数'arg'。 – Bergi