Crossing to the other side: Functional Javascripting

Alex Badea

First Impressions

Is it better?

Is it difficult?

Is it completely different?

The tools

  • Pure functions
  • Function composition
  • Immutability

Pure functions

Impure Pure functions

let state;

const impureFunction = (...params) => {

    // do stuff with params

    state = 'hamster';

}

let state = {};

const alsoImpureFunction = (state) => {

    // do stuff with params

    state.myPet = 'hamster';

}

const alsoAlsoImpureFunction = () => {

    const someData = document.querySelectAll('intuitiveClassName')

        .map(domElem => domElem.dataset.intuitivePropName);

 

    fetch("/path", {

        method: "POST",

        body: JSON.stringify(someData),

    }).then(/* update stuff here */);

};

Pure functions

Text

let state;

const pureFunction = (...param) => {

    // do stuff with params

    return 'hamster';

}

state = pureFunction();

let state;

const impureFunction = (...params) => {

    // do stuff with params

    state = 'hamster';

}

Text

let state = {};

const alsoPureFunction = (state = {}) => {

    const newState = Object.assign({}, state);

    // do stuff with params

    newState.myPet = 'hamster';

    return newState;

}

state = alsoPureFunction(state);

let state = {};

const alsoImpureFunction = (state) => {

    // do stuff with params

    state.myPet = 'hamster';

}

Text

const getDataSet = (className) => document.querySelectAll(className)

    .map(domElem => domElem.dataset.prop);

const fetchFromServer = (dataArray) => {

    fetch("/path", {

        method: "POST",

        body: JSON.stringify(dataArray),

    }).then(resp => resp.json());

};

const alsoAlsoPureFunction = async (className) => {

    const serverData = await fetchFromServer(getDataSet(className));

    // do stuff with serverData

    return parsedServerData;

};

const alsoAlsoImpureFunction = () => {

    const someData = document.querySelectAll('intuitiveClassName')

        .map(domElem => domElem.dataset.intuitivePropName);

 

    fetch("/path", {

        method: "POST",

        body: JSON.stringify(someData),

    }).then(/* update stuff here */);

};

Function composition

const parseUserNames = userArray => userArray

        .map(user => `${user.firstName} ${user.lastName}`);

 

const validateUserNames = userNameArray => userNameArray

        .every(name => name.length < 50 && name.length > 5);

 

validateUserNames(parseUserNames(userList));

Partial application

const greetPerson = (greeting = 'Hello', message = 'Have an awesome day!', name) => {

    return `${greeting} ${name}! ${message}`;

};

const britishGreet = (greeter, name) => {

    return greeter('Rainnin\' cats and dogs, innit,', 'Can I shag a fag off ya?', name);

};

const britishGreet2 = greetPerson.bind(null, 'Rainnin\' cats and dogs, innit,', 'Can I shag a fag off ya?');

Currying

const greet = (greeting = 'Hello') => {

    return (name = 'Stranger') => {

        return (message = 'Have a nice day!') => `${greeting} ${name}! ${message}`;

    }

}

greet('Hey')('Alex')('You are an awesome programmer!!');

 

const sayHey = greet('Hey');

sayHey('Alex')('Just kidding');

 

const messageAlex = sayHey('Alex');

messageAlex('No seriously...');

Immutabilty

const user = {

    settings: {

        landingPage: 'home',

        theme: 'dark',

    }

};

Object.freeze(user);

const userClone = Object.assign({}, user);

 

user.settings.landingPage = 'not home';

userClone.settings.theme = 'light';

Immutable JS

Mori

Seamless immutable

Freezer

Mutatis

React's immutability helpers

Crossing to the other side: Functional Javascripting

By alexb_90

Crossing to the other side: Functional Javascripting

  • 457