函数优先的编程语言

当一种编程语言被称为函数优先(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()();

可以如上使用两个括号()()来调用返回的方法。

你可能感兴趣的:(函数优先的编程语言)