当一种编程语言被称为函数优先(First-class functions)的编程语言时,是指该语言中函数可以和其他任何变量一样对待。例如,一个函数可以作为参数传递给另一个函数,可以作为返回值被另一个函数返回,可以作为一个值分配给一个变量。
如下例子使用JavaScript语言演示
分配一个函数给一个变量
const foo = function() {
console.log("foobar");
}
// Invoke this function using the variable: foo
foo();
- 首先定义一个匿名函数,并把它赋值给一个变量:foo
- 在变量后边添加小括号()parentheses来通过变量调用该方法
即使方法被命名,仍然可以使用变量名调用,但是不能使用方法名直接调用。使用变量命名后在debug代码的时候是有帮助的,对调用方式没有影响。
如下:
const foo2 = function foo1() {
console.log("foobar1");
}
//right to invoke
foo2();
//error to invoke
foo1();
将方法作为参数进行传递
function sayHello() {
return "hello,";
}
function sayHi = function() {
return "hi,";
}
function greeting(helloMessage, name) {
console.log(helloMessage() + name;
}
//Pass `sayHello` as an argument to `greeting` function
greeting(sayHello, "JavaScript!");
//Pass `sayHi` as an argument to `greeting` function
greeting(sayHi, "codepen");
- 通过直接命名或者匿名定义了两个函数
- 直接将sayHello()方法和sayHi作为参数传递给方法greeting(),这里就解释可以把方法当做一个值来对待。
把一个方法A作为参数传递给另一个方法B,那么方法A我们成为回调函数Callback function,在这里sayHello就是回调函数
返回一个方法(将方法作为返回值)
function sayHello() {
return function() {
console.log("hello!");
}
}
//we have two ways to invoke
//1.using a variable
const myFunc = sayHello();
myFunc();
//2.using double parentheses
sayHello()();
在这个例子中,我们在方法sayHello中返回了另外一个方法:之所以能这么做,是因为在JavaScript中方法(function)也被当做一个值(value)。
一个方法A返回一个方法B,那么方法A叫做高阶函数 Higher-Order Function
在例子中,我们有两种方式来调用sayHello方法以及其返回的匿名函数(Anonymous Function),如下图:
- 1.使用变量
const myFunc = sayHello();
那么此时myFunc其实就是一个匿名函数了,要调用这个匿名函数,那么就在变量名后边加上小括号就好了。
myFunc();
也就是这里要调用sayHello方法返回的匿名函数,需要定义一个变量。因为直接调用sayHello函数返回的就是这个匿名函数,但是这个匿名函数并没有调用。
- 2.使用两个括号
sayHello()();
可以如上使用两个括号()()来调用返回的方法。