有人可以解释一下为什么我们可以简单地将方法名称传递给更高阶的函数并且一切正常。我知道在 Java 之类的东西中,我必须单独调用每个元素的 words
方法。有人告诉我,在 Javascript 中,如果方法签名匹配,我们可以简单地用 () 传入函数名称,它就会起作用。这很棒,但我想知道后台发生了什么。为什么我们能够在 javascript 中做到这一点?
function words(str) {
return str.split(" ");
}
var sentences = function(newArr){
return newArr.map(words);
}
最佳答案
在许多语言中,您可以将对函数的引用作为参数传递给函数。然后允许主机函数使用该参数并在适当的时候调用该函数。这就是 Javascript 中发生的全部事情。当您传递函数名称而后面没有 ()
时,您只是传递对该函数的引用。这使得主机函数能够使用该函数作为参数并在一段时间后调用它。
在您的具体示例中,.map()
希望您传入一个函数,该函数将为数组中的每个项目调用一次。因此,您传递一个函数的名称,然后该函数将被多次调用,对于数组中的每个项目一次。您传递的函数有一些必须满足的契约。它将传递三个参数(值、索引、数组)
,并且它必须返回一个用于构造新数组的值。
在 Javascript 中,由于语言没有参数类型检查,因此开发人员有责任确保您传递的函数的参数与该函数的调用者实际传递给它的参数相匹配,您必须咨询调用代码本身的文档,以了解将传递给它的参数。您可以将参数命名为您想要的任何名称(这完全是函数实现内部的),但参数的顺序和数量由调用者确定,并且您必须声明您的函数以匹配调用者将提供的内容。
曾经让许多人在 Javascript 中感到困惑。
如果您仅传递函数名称,则传递的是对该函数的引用(主机函数可以稍后调用该函数)。
array.map(myFn) // passes a function reference
或者,使用内联函数(相同的结果):
array.map(function(value, index, arr) {
// code goes here
})
如果将括号放在函数名称的末尾,则该函数将立即执行,并且该函数执行的返回值就是传递的内容:
array.push(myFn()); // pushes the result of calling myFn()
关于Javascript相同方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054045/