有人可以解释为什么我们可以简单地将方法名称传递给更高阶的函数,一切正常。我知道像Java这样的东西我必须分别在每个元素上调用方法words
。我被告知在Javascript中如果方法签名匹配,我们可以简单地用()传递函数的名称,它将起作用。这很棒,但我想知道后台发生了什么。为什么我们能在javascript中执行此操作?
function words(str) {
return str.split(" ");
}
var sentences = function(newArr){
return newArr.map(words);
}
答案 0 :(得分:1)
你 重复调用words
函数。你正在为地图函数的每次迭代调用它。
map函数接受每次迭代运行的回调。该回调通常采用
的形式 function (elementOfNewArr, indexOfNewArr, newArr) { }
因为函数是对象,所以可以将它们存储在变量上并使用该新变量名称来调用该函数,而不是原始函数。这主要是将函数用作对象。 你可以抛弃它们。
let foo = function () { return 'jasper!'; }
let boo = foo;
let ron = boo; // ron() will now return 'jasper!'
所以,你所做的就是在你的回调函数中运行,尽管它是在其他地方定义的。由于回调函数(如所有函数都是对象),您可以声明该回调函数,将其“保存”到您想要的任何变量,并在可以正常使用它的任何地方使用它。
如果您必须在多个地方使用相同的功能,这非常有用。
答案 1 :(得分:1)
在许多语言中,您可以将对函数的引用作为函数的参数传递。然后允许主机函数使用该参数并在适当时调用该函数。这就是Javascript中的所有内容。当你传递一个没有()
的函数的名称时,你只是传递对该函数的引用。这使得主机功能可以将该函数用作参数,并在以后调用它。
在您的具体示例中,.map()
希望您传入一个函数,它将为数组中的每个项调用一次。因此,您传递一个函数的名称,然后多次调用该函数,对于数组中的每个项目。你通过的那个功能有一点合同,它必须满足。它将传递三个参数(value, index, array)
,并且它必须返回一个将用于构造新数组的值。
在Javascript中,由于语言没有参数类型检查,开发人员有责任确保您传递的函数的参数与该函数的调用者实际传递给它的参数匹配,并且您必须咨询调用代码本身的文档,以了解将传递给它的参数。您可以将参数命名为您想要的任何内容(这完全是函数实现的内部参数),但参数的顺序和数量由调用者确定,您必须声明您的函数以匹配调用者将提供的函数。
一旦在Javascript中混淆了很多东西。
如果只传递一个函数名,则传递对函数的引用(主机函数稍后可以调用的函数)。
array.map(myFn) // passes a function reference
或者,使用内联函数(相同的结果):
array.map(function(value, index, arr) {
// code goes here
})
如果你将parens放在函数名的末尾,那么函数会立即执行,并且该函数执行的返回值是传递的:
array.push(myFn()); // pushes the result of calling myFn()
答案 2 :(得分:0)
我认为你误解的是,函数本身可以和javascript中的其他变量一样对待。考虑这个例子:
var newArr = [1,2,3,4];
newArr.map(function(item){
return item * item;
});
在上面的示例中,函数作为参数传递给map()
函数。请注意,它是匿名描述的(未给出函数名称)。你可以完成同样的事情:
var newArr = [1,2,3,4];
function squared(item){
return item * item;
}
newArr.map(squared);
这两个例子实现了相同的功能,除了第二个例子,而不是编写函数,我们在代码中更早地定义它。如果它有帮助,您甚至可以像使用任何其他常规变量一样创建函数:
var squared = function(item){
return item * item;
};
您可以以相同的方式传递此功能。如果您想知道以这些方式定义函数之间的区别,请尝试var functionName = function() {} vs function functionName() {}