Why does JavaScript have
First-class function?
Peter Chen
2018-01-27
First-class function
is a necessity
for the functional programming
Agenda
- First-class citizen
- First-class function
First-class citizen
Definition
An entity which supports all the operations generally available to other entities.
Operations
- Pass as an argument
- Returned from a function
- Modified
- Assigned to a variable
Question
Who is First-class citizen?
Integer In C is an First-class citizen
#include <stdio.h>
// Pass as an argument
int integer_is_first_class_citizen ( int arg ) {
return arg; // Returned from a function
}
int main()
{
int arg = 0; // Assigned to a variable
arg = 1; // Modified
integer_is_first_class_citizen ( arg );
printf("Integer is a First-class citizen\n");
return 0;
}
Array In C isn't an First-class citizen
#include<stdio.h>
// arr is a pointer to the array's first element
void array_is_not_first_class_citizen ( int *arr, int count ) {
for(int i = 0; i < count; i++) {
arr[i]++;
}
}
int main() {
int arr[] = {0, 1, 2, 3, 4};
array_is_not_first_class_citizen ( arr, 5 );
for(int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
} // 1 2 3 4 5
}
First-class function
Definition
Treat function as First-class citizen
Feature
- Higher-order functions
- Nested functions
- Anonymous functions
- Non-local variables
Higher-order function
- Take one or more functions as arguments
- Returns a function as its result
// Higher-order function
// 1. Take one or more functions as arguments
function takeFuncAsArg(callback) {
return callback("Arguments");
}
function helloWorld(featureName) {
return "Hello " + featureName;
}
console.log(takeFuncAsArg(helloWorld));
// 2. Returns a function as its result
function returnFunc(callback) {
return callback;
}
console.log(returnFunc(helloWorld)("Results"));
Nested function
A function which is defined within another function
// 2. Nested function
// A function which is defined within another function
function outterFunc(){
function innerFunc() {
return 'Inner';
}
return 'Hello Outter ' + innerFunc();
}
console.log(outterFunc());
Anonymous function
A function definition that is not bound to an identifier
// 3. Anonymous function
// A function definition that is not bound to an identifier
console.log(function() {return 'Hello Anonymous'}());
Non-local variable
A variable that is not defined in the local scope
// 4. Non-local variable
// A variable that is not defined in the local scope
function nonLocalVariable() {
// outter is non-local variable for innerFunc
var outter = "Non-local variable";
function innerFunc() {
return outter;
}
return "Hello " + innerFunc();
}
console.log(nonLocalVariable());