Javascript 相同的方法签名
Javascript same method signature
有人可以解释一下为什么我们可以简单地将方法名称传递给高阶函数并且一切正常。我知道在类似 Java 的情况下,我必须分别对每个元素调用方法 words
。有人告诉我,在 Java 脚本中,如果方法签名匹配,我们可以简单地用 () 传入函数的名称,它就会起作用。这很棒,但我想知道后台发生了什么。为什么我们能够在 javascript 中做到这一点?
function words(str) {
return str.split(" ");
}
var sentences = function(newArr){
return newArr.map(words);
}
您正在重复调用words
函数。您正在为 map 函数的每次迭代调用它。
map 函数接受一个回调,它会在每次迭代时运行。该回调通常采用
的形式
function (elementOfNewArr, indexOfNewArr, newArr) { }
因为函数是对象,您可以将它们存储在一个变量上,并使用新的变量名来调用该函数,而不是原来的函数。这主要是将函数用作对象。 你可以把它们扔来扔去。
let foo = function () { return 'jasper!'; }
let boo = foo;
let ron = boo; // ron() will now return 'jasper!'
所以,尽管它是在别处定义的,但您所做的只是扑通一声进入回调函数。由于回调函数,就像所有函数都是对象一样,您可以声明该回调函数,"saving" 将其声明为您想要的任何变量,并在您可以正常使用它的任何地方使用它。
如果您必须在多个地方使用相同的功能,这将非常有用。
在许多语言中,您可以将对函数的引用作为参数传递给函数。然后允许宿主函数使用该参数并在适当的时候调用该函数。这就是 Javascript 中发生的所有事情。当您传递函数名称后没有 ()
时,您只是传递了对该函数的引用。这使宿主函数能够将该函数用作参数并在稍后调用它。
在您的具体示例中,.map()
希望您传入一个函数,它将为数组中的每个项目调用一次。因此,您传递了一个函数的名称,该函数将被多次调用,数组中的每个项目一次。您传递的那个函数有一些必须满足的契约。它将传递三个参数 (value, index, array)
并且它必须 return 一个将用于构造新数组的值。
在 Javascript 中,由于语言没有参数类型检查,因此开发人员有责任确保您传递的函数的参数与该函数的调用者实际传递给的参数相匹配它并且您必须查阅调用代码本身的文档以了解将传递给它的参数。您可以根据需要命名参数(这完全在您的函数实现内部),但参数的顺序和数量由调用者决定,您必须声明您的函数以匹配调用者将提供的内容。
曾经在 Javascript.
中让很多人感到困惑的事情
如果您只传递一个函数名,那么您传递的是对该函数的引用(宿主函数稍后可以调用的东西)。
array.map(myFn) // passes a function reference
或者,使用内联函数(相同的结果):
array.map(function(value, index, arr) {
// code goes here
})
如果将括号放在函数名的末尾,则该函数会立即执行,并且传递的是该函数执行的 return 值:
array.push(myFn()); // pushes the result of calling myFn()
我认为您误解了函数本身可以与 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() {}
有人可以解释一下为什么我们可以简单地将方法名称传递给高阶函数并且一切正常。我知道在类似 Java 的情况下,我必须分别对每个元素调用方法 words
。有人告诉我,在 Java 脚本中,如果方法签名匹配,我们可以简单地用 () 传入函数的名称,它就会起作用。这很棒,但我想知道后台发生了什么。为什么我们能够在 javascript 中做到这一点?
function words(str) {
return str.split(" ");
}
var sentences = function(newArr){
return newArr.map(words);
}
您正在重复调用words
函数。您正在为 map 函数的每次迭代调用它。
map 函数接受一个回调,它会在每次迭代时运行。该回调通常采用
的形式function (elementOfNewArr, indexOfNewArr, newArr) { }
因为函数是对象,您可以将它们存储在一个变量上,并使用新的变量名来调用该函数,而不是原来的函数。这主要是将函数用作对象。 你可以把它们扔来扔去。
let foo = function () { return 'jasper!'; }
let boo = foo;
let ron = boo; // ron() will now return 'jasper!'
所以,尽管它是在别处定义的,但您所做的只是扑通一声进入回调函数。由于回调函数,就像所有函数都是对象一样,您可以声明该回调函数,"saving" 将其声明为您想要的任何变量,并在您可以正常使用它的任何地方使用它。
如果您必须在多个地方使用相同的功能,这将非常有用。
在许多语言中,您可以将对函数的引用作为参数传递给函数。然后允许宿主函数使用该参数并在适当的时候调用该函数。这就是 Javascript 中发生的所有事情。当您传递函数名称后没有 ()
时,您只是传递了对该函数的引用。这使宿主函数能够将该函数用作参数并在稍后调用它。
在您的具体示例中,.map()
希望您传入一个函数,它将为数组中的每个项目调用一次。因此,您传递了一个函数的名称,该函数将被多次调用,数组中的每个项目一次。您传递的那个函数有一些必须满足的契约。它将传递三个参数 (value, index, array)
并且它必须 return 一个将用于构造新数组的值。
在 Javascript 中,由于语言没有参数类型检查,因此开发人员有责任确保您传递的函数的参数与该函数的调用者实际传递给的参数相匹配它并且您必须查阅调用代码本身的文档以了解将传递给它的参数。您可以根据需要命名参数(这完全在您的函数实现内部),但参数的顺序和数量由调用者决定,您必须声明您的函数以匹配调用者将提供的内容。
曾经在 Javascript.
中让很多人感到困惑的事情如果您只传递一个函数名,那么您传递的是对该函数的引用(宿主函数稍后可以调用的东西)。
array.map(myFn) // passes a function reference
或者,使用内联函数(相同的结果):
array.map(function(value, index, arr) {
// code goes here
})
如果将括号放在函数名的末尾,则该函数会立即执行,并且传递的是该函数执行的 return 值:
array.push(myFn()); // pushes the result of calling myFn()
我认为您误解了函数本身可以与 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() {}