<info 340/>

Functional JavaScript

Joel Ross
Spring 2020

Functions

function sayHello(name){
    return "Hello, "+name;
}

let msg = sayHello("Joel");
console.log(msg); //"Hello Joel"

FUNCTIONS

 

ARE ALSO

VALUES

Functions are Values

Functions are a type of value (just like number, string, array).
Anywhere you can put an Array, you can put a Function.

They can be assigned as values to other variables.

//assign array to variable
let myArray = ['a','b','c'];



typeof myArray //=> 'object'
let other = myArray;

//access value in other
console.log( other[1] ); //print 'b'
//assign function to variable
function sayHello(name) { 
   console.log("Hello, "+name);
}

typeof sayHello // 'function'
let other = sayHello;

//prints "Hello, everyone"
other('everyone'); 

special array ability

special function ability

Anonymous Value

let array = [1,2,3]; //named variable (not anonymous)
console.log(array); //pass in named var

console.log( [4,5,6] ); //pass in anonymous value

An anonymous value is a value to which we don't assign a name/label (variable). Also a literal value.

//named function
function sayHello(person){ 
   console.log("Hello, "+person); 
}
//named function
function sayHello(person){ 
   console.log("Hello, "+person); 
}

//anonymous function (no name!) - technically invalid
function(person) {
   console.log("Hello, "+person);
}
//named function
function sayHello(person){ 
   console.log("Hello, "+person); 
}

//anonymous function (no name!) - technically invalid
function(person) {
   console.log("Hello, "+person);
}

//anonymous function (value) assigned to variable
let sayHello = function(person) {
   console.log("Hello, "+person);
}

So they can be assigned to properties (values) in Objects.

let obj = {};
let myArray = ['a','b','c'];



//assign array to object
obj.array = myArray;

//access with dot notation
obj.array[0]; //gets 'a'


//assign literal (anonymous value)
obj.otherArray = [1,2,3]
let obj = {}
function sayHello(name) { 
   console.log("Hello, "+name);
}

//assign function to object
let obj.sayHi = sayHello;

//access with dot notation
obj.sayHi('all'); //prints "Hello all"


//assign literal (anonymous value)
obj.otherFunc = function() { 
    console.log("Hello world!");
}

this is how you make
"non-static" methods

Functions are Values

Functions are Values

So they can be passed as parameters to other functions!

let myArray = ['a','b','c'];



//takes array as an argument
//will access the arg array
//with an index of 1
function doOneth(array) {
  console.log( array[1] );
}



//call function and pass value
doOneth(myArray); //prints 'b'


//pass literal (anonymous value)
doOneth([1,2,3]) //prints '2'

function sayHello(name) { 
   console.log("Hello, "+name);
}

//takes ANOTHER FUNCTION as an arg
//will call the arg function, 
//passing it "world"
function doWorld(aFunction) {
   aFunction("world");
}



//call function and pass value
doWorld(sayHello); //prints "Hello world"


//pass literal (anonymous value)
doWorld(function(msg) {
  console.log("you said: "+msg);
}); //prints "you said: world"

/* note where parens and braces close! */

array ability with hard-coded value

function ability with hard-coded value

Passing vs. Calling

When you pass a function as an argument, do not put parentheses after it. Putting parentheses calls the function (executes it), and replaces that expression with the returned value.

function sayHello() { //version with no args
    return "Hello";
}

//print out the function
console.log( sayHello ); // logs "[Function: sayHello]" 
                         // the function

//resolve the expression, THEN print that out
console.log( sayHello() ); // logs "Hello", which is 
                            // what `sayHello()` resolves to.

Callback Functions

A function that is passed into another function for the receiver to "call back to" and execute later.

//takes in TWO callback functions!
function doTogether(firstCallback, secondCallback){
    firstCallback();  //execute the first function
    secondCallback();  //execute the second function
    console.log('at the "same time"!');
}

function patHead() {
    console.log('pat your head');
}

function rubBelly() {
    console.log('rub your belly');
}

//pass in the callbacks to do them together
doTogether(patHead, rubBelly);

no parens, not calling now (just passing the variable!)

Array Iteration

To iterate through each item in an array you can, use
the .forEach() function and pass it a callback to execute on each array item.

//Iterate through an array
let array = ['a','b','c'];
let printItem = function(item) {
   console.log(item);
}

array.forEach(printItem);

//more common to use anonymous function
array.forEach(function(item) {
   console.log(item);
});

callback

Mapping

function square(n) { //a function that squares a number
    return n*n;
}

let numbers = [1,2,3,4,5];  //an initial array

//transform the numbers using the square() function
let squares = []; //the transformed array
for(let i=0; i<numbers.length; i++) {
   let transformed = square(numbers[i]);
   squares.push(transformed); //add transformed to array
}
console.log(squares); // [1, 4, 9, 16, 25]

The .map() function applies the given callback function to each element in an array and returns a new array of the transformed values.

function square(n) { //a function that squares a number
    return n*n;
}

let numbers = [1,2,3,4,5];  //an initial array

//map the numbers using the `square` transforming function
let squares = numbers.map(square);




console.log(squares); // [1, 4, 9, 16, 25]




let numbers = [1,2,3,4,5];  //an initial array

//map the numbers using anonymous callback function
let squares = numbers.map(function(n) {
    return n*n;
})


console.log(squares); // [1, 4, 9, 16, 25]

Filtering

The .filter() function applies the given callback function to each element in an array and returns a new array containing only those elements for which the callback returns true.

let array = [3,1,4,2,5];

let isACrowd = array.filter(function(n) { 
   return n >= 3; //keep if > 3
}); //returns [3,4,5]

Reducing

The .reduce() function uses the given callback function to aggregate (combine) the elements in the list into a single value.

function link(accumulation, newItem) { //adds two numbers
    let newAccumulation = accumulation + "->" + newItem;
    return newAccumulation;
}

let letters = ['a','b','c','d','e'];  //an initial array

let linked = ""; //an accumulated aggregate, start at ""
for(let i=0; i<letters.length; i++){
    linked = link(linked, letters[i]);
}
console.log(linked); //"->a->b->c->d->e"
function link(accumulation, newItem) { //adds two numbers
    let newAccumulation = accumulation + "->"+newItem;
    return newAccumulation;
}

let letters = ['a','b','c','d','e'];  //an initial array

let linked = letters.reduce(link, ""); //pass func, starting value



console.log(linked); //"->a->b->c->d->e"

info340sp20-functional-js

By Joel Ross

info340sp20-functional-js

  • 623