Movatterモバイル変換


[0]ホーム

URL:


Packt
Search iconClose icon
Search icon CANCEL
Subscription
0
Cart icon
Your Cart(0 item)
Close icon
You have no products in your basket yet
Save more on your purchases!discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Profile icon
Account
Close icon

Change country

Modal Close icon
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timerSALE ENDS IN
0Days
:
00Hours
:
00Minutes
:
00Seconds
Home> Programming> Functional Programming> Mastering JavaScript Functional Programming
Mastering JavaScript Functional Programming
Mastering JavaScript Functional Programming

Mastering JavaScript Functional Programming: Write clean, robust, and maintainable web and server code using functional JavaScript and TypeScript , Third Edition

Arrow left icon
Profile Icon Federico Kereki
Arrow right icon
$35.98$39.99
Full star iconFull star iconFull star iconFull star iconHalf star icon4.6(14 Ratings)
eBookApr 2023614 pages3rd Edition
eBook
$35.98 $39.99
Paperback
$49.99
Subscription
Free Trial
Renews at $19.99p/m
Arrow left icon
Profile Icon Federico Kereki
Arrow right icon
$35.98$39.99
Full star iconFull star iconFull star iconFull star iconHalf star icon4.6(14 Ratings)
eBookApr 2023614 pages3rd Edition
eBook
$35.98 $39.99
Paperback
$49.99
Subscription
Free Trial
Renews at $19.99p/m
eBook
$35.98 $39.99
Paperback
$49.99
Subscription
Free Trial
Renews at $19.99p/m

What do you get with eBook?

Product feature iconInstant access to your Digital eBook purchase
Product feature icon Download this book inEPUB andPDF formats
Product feature icon Access this title in our online reader with advanced features
Product feature iconDRM FREE - Read whenever, wherever and however you want
Product feature iconAI Assistant (beta) to help accelerate your learning
OR

Contact Details

Modal Close icon
Payment Processing...
tickCompleted

Billing Address

Table of content iconView table of contentsPreview book icon Preview Book

Mastering JavaScript Functional Programming

Thinking Functionally – A First Example

InChapter 1,Becoming Functional, we went over what FP is, mentioned some advantages of applying it, and listed some tools we’d need in JavaScript. For now, let’s leave the theory behind and start by considering a simple problem and how to solve it in afunctional way.

In this chapter, we will dothe following:

  • Look at a simple,e-commerce-related problem
  • Consider several usual ways to solve it (with theirassociated defects)
  • Find a way to solve the problem by looking atit functionally
  • Devise a higher-order solution that can be applied toother problems
  • Work out how to carry out unit testing forfunctional solutions

In future chapters, we’ll be returning to some of the topics listed here, so we won’t be going into too much detail. We’ll just show how FP can give a different outlook on our problem and leave further detailsfor later.

After working through this chapter, you will have had a first look at a common problem and at a way of solving it by thinking functionally, as a prelude for the rest ofthis book.

Our problem – doing something only once

Let’sconsider a simple but common situation. You have developed an e-commerce site; the user can fill their shopping cart, and in the end, they must click on aBill me button so that their credit card will be charged. However, the user shouldn’t click twice (or more), or they will be billedseveral times.

The HTML part of your application might have something likethis somewhere:

<button    onclick="billTheUser(some, sales, data)">Bill me      </button>

And, among the scripts, you’d have something similar to thefollowing code:

function billTheUser(some, sales, data) {  window.alert("Billing the user...");  // actually bill the user}

A bad example

Assigning the events handler directly in HTML, the way I did it, isn’t recommended. Instead, unobtrusively, you should set the handler through code. So,do as I say, not asI do!

This is a bare-bones explanation of the web page problem, but it’s enough for our purposes. Now, let’s get to thinking about ways of avoiding repeated clicks on that button. How can we manage to prevent the user from clicking more than once? That’s an interesting problem, with several possible solutions – let’s start by looking atbad ones!

How many ways can you think of to solve our problem? Let’s go over several solutions and analyzetheir quality.

Solution 1 – hoping for the best!

How can we solve theproblem? The first solution may seem like a joke: do nothing, tell the user not to click twice, and hope for the best! Your page might look likeFigure 2.1:

Figure 2.1 – An actual screenshot of a page, just warning you against clicking more than once

Figure 2.1 – An actual screenshot of a page, just warning you against clicking more than once

This is a way to weasel out of the problem; I’ve seen several websites that just warn the user about the risks of clicking more than once and do nothing to prevent the situation. So, the user got billed twice? We warned them... it’stheir fault!

Your solution might simply look like thefollowing code:

<button  id="billButton"  onclick="billTheUser(some, sales, data)">Bill me</button><b>WARNING: PRESS ONLY ONCE, DO NOT PRESS AGAIN!!</b>

Okay, this isn’t anactual solution; let’s move on to moreserious proposals.

Solution 2 – using a global flag

The solutionmost people would probably think of first is using some global variable to record whether the user has already clicked on the button. You define a flag named something likeclicked, initialized withfalse. When the user clicks on the button, ifclicked isfalse, you change it totrue and execute the function; otherwise, you do nothing at all. This can be seen in thefollowing code:

let clicked = false;...function billTheUser(some, sales, data) {  if (!clicked) {    clicked = true;    window.alert("Billing the user...");    // actually bill the user  }}

This works, but it has several problems that mustbe addressed:

  • You are using a global variable, and you could change its value by accident. Global variables aren’t a good idea, in JavaScript or other languages. You must also remember to re-initialize it tofalse when the user starts buying again. If you don’t, the user won’t be able to make a second purchase because paying willbecome impossible.
  • You will have difficulties testing this code because it depends on external things (that is, theclicked variable).

So, this isn’t a very good solution. Let’skeep thinking!

Solution 3 – removing the handler

We maygo for a lateral kind of solution, and instead of having the function avoid repeated clicks, we might just remove the possibility of clicking altogether. The following code does just that; the first thing thatbillTheUser() does is remove theonclick handler from the button, so no further calls willbe possible:

function billTheUser(some, sales, data) {  document    .getElementById("billButton")    .onclick = null;  window.alert("Billing the user...");  // actually bill the user}

This solution also hassome problems:

  • The code is tightly coupled to the button, so you won’t be able to reuseit elsewhere
  • You must remember to reset the handler; otherwise, the user won’t be able to make asecond purchase
  • Testing will also be more complex because you’ll have to provide someDOM elements

We can enhance this solution a bit and avoid coupling the function to the button by providing the latter’s ID as an extra argument in the call. (This idea can also be applied to some of the further solutions that we’ll see.) The HTML part would be as follows; note the extra argumenttobillTheUser():

<button  id="billButton"  onclick="billTheUser('billButton', some, sales, data)">Bill me</button>

We also have to change the called function so that it will use the receivedbuttonId value to access thecorresponding button:

function billTheUser(buttonId, some, sales, data) {  document.getElementById(buttonId).onclick = null;  window.alert("Billing the user...");  // actually bill the user}

This solution is somewhat better. But, in essence, we are still using a global element – not a variable, but theonclick value. So, despite the enhancement, this isn’t a very good solution either. Let’smove on.

Solution 4 – changing the handler

A variant to the previous solution would be not to remove the click function, but to assign a new one instead. We are using functions as first-class objects here when we assign thealreadyBilled() function to the click event. The function warning the user that they have already clicked could look somethinglike this:

function alreadyBilled() {  window.alert("Your billing process is running; don't    click, please.");}

OurbillTheUser() function would then be like the following code – note how instead of assigningnull to theonclick handler as in the previous section, now, thealreadyBilled() functionis assigned:

function billTheUser(some, sales, data) {  document    .getElementById("billButton")    .onclick = alreadyBilled;  window.alert("Billing the user...");  // actually bill the user}

There’s a good point to this solution; if the user clicks a second time, they’ll get a warning not to do that, but they won’t be billed again. (From the point of view of user experience, it’s better.) However, this solution still has the very same objections as the previous one (code coupled to the button, needing to reset the handler, and harder testing), so we don’tconsider it quitegood anyway.

Solution 5 – disabling the button

A similar idea hereis instead of removing the event handler, we can disable the button so the user won’t be able to click. You might have a function such as the one shown in the following code, which does exactly that by setting thedisabled attribute ofthe button:

function billTheUser(some, sales, data) {  document    .getElementById("billButton")    .setAttribute("disabled", "true");  window.alert("Billing the user...");  // actually bill the user}

This also works, but we still have objections as with the previous solutions (coupling the code to the button, needing to re-enable the button, and harder testing), so we don’t like thissolution either.

Solution 6 – redefining the handler

Another idea: instead ofchanging anything in the button, let’s have the event handler change itself. The trick is in the second line of the following code; by assigning a new value to thebillTheUser variable, we are dynamically changing what the function does! The first time you call the function, it will do its thing, but it will also change itself out of existence by giving its name to anew function:

function billTheUser(some, sales, data) {  billTheUser = function() {};  window.alert("Billing the user...");  // actually bill the user}

There’s aspecial trick in the solution. Functions are global, so thebillTheUser=... line changes the function’s inner workings. From that point on,billTheUser will be the new (null) function. This solution is still hard to test. Even worse, how would you restore the functionality ofbillTheUser, setting it back to itsoriginal objective?

Solution 7 – using a local flag

We can goback to the idea of using a flag, but instead of making it global (which was our main objection to the second solution), we canuse anImmediately Invoked Function Expression (IIFE), which we’ll see more about inChapter 3,Starting Out with Functions, andChapter 11,Implementing Design Patterns. With this, we can use a closure, soclicked will be local to the function and not visibleanywhere else:

var billTheUser = (clicked => {  return (some, sales, data) => {    if (!clicked) {      clicked = true;      window.alert("Billing the user...");      // actually bill the user    }  };})(false);

This solution is along the lines of the global variable solution, but using a private, local variable is an enhancement. (Note howclicked gets its initial value from the call at the end.) The only drawback we could find is that we'll have to rework every function that needs to be called only once to work in this fashion (and, as we’ll see in the following section, our FP solution is similar to it in some ways). Okay, it’s not too hard to do, but don’t forget theDon’t Repeat Yourself (DRY),usualadvice!

We have now gone through multiple ways of solving our “do something only once” problem – but as we’ve seen, they were not very good! Let’s think about the problem functionally so that we get a moregeneral solution.

A functional solution to our problem

Let’s try to be moregeneral; after all, requiring that some function or other be executed only once isn’t that outlandish, and may be required elsewhere! Let’s lay downsome principles:

  • The original function (the one that may be called only once) should do whatever it is expected to do andnothing else
  • We don’t want to modify the original function inany way
  • We need a new function that will call the original oneonly once
  • We want a general solution that we can apply to any number oforiginal functions

A SOLID base

The first principle listed previously is the single responsibility principle (the S in theSOLID acronym), which states that every function should be responsible for a single functionality. For more on SOLID, check the article by Uncle Bob (Robert C. Martin, who wrote the five principles)atbutunclebob.com/ArticleS.UncleBob.PrinciplesOfOod.

Can we do it? Yes, and we’ll write a higher-order function, which we’ll be able to apply to any function, to produce a new function that will work only once. Let’s see how! We will introduce higher-order functions inChapter 6,Producing Functions. There, we’ll go about testing our functional solution, as well as making some enhancementsto it.

A higher-order solution

If we don’t want to modifythe original function, we can create a higher-order function, which we’ll (inspiredly!) nameonce(). This function will receive a function as a parameter and return a new function, which will work only once. (As we mentioned previously, we’ll be seeing more of higher-order functions later; in particular, see theDoing things once, revisited section ofChapter 6,Producing Functions).

Many solutions

Underscore and Lodash already have a similar function, invoked as_.once(). Ramda also providesR.once(), and most FP libraries include similar functionality, so you wouldn’t have to program it onyour own.

Ouronce() function may seem imposing at first, but as you get accustomed to working in an FP fashion, you’ll get used to this sort of code and find it to bequite understable:

// once.tsconst once = <FNType extends (...args: any[]) => any>(  fn: FNType) => {  let done = false;  return ((...args: Parameters<FNType>) => {    if (!done) {      done = true;      return fn(...args);    }  }) as FNType;};

Let’s go over some of the finer points ofthis function:

  • Ouronce() function receives a function (fn) as its parameter and returns a new function, of the same type. (We’ll discuss this typing in moredetail shortly.)
  • We define an internal, privatedone variable, by taking advantage ofclosure, as inSolution 7. We opted not to call itclicked (as we did previously) because you don’t necessarily need to click on a button to call the function; we went for a more general term. Each time you applyonce() to some function, a new, distinctdone variable will be created and will be accessible only from thereturned function.
  • Thereturn statement shows thatonce() will return a function, with the same type of parameters as the originalfn() one. We are using the spread syntax we saw inChapter 1,Becoming Functional. With older versions of JavaScript, you’d have to work with the arguments object; seedeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments for more on that. The modern way is simplerand shorter!
  • We assigndone = true before callingfn(), just in case that function throws an exception. Of course, if you don’t want to disable the function unless it has successfully ended, you could move the assignment below thefn() call. (SeeQuestion 2.4 in theQuestions section for another takeon this.)
  • After the setting is done, we finally call the original function. Note the use of the spread operator to pass along whatever parameters the originalfn() had.

Typing foronce() may be obscure. We have to specify that the type of the input function and the type ofonce() are the same, and that’s the reason for definingFNType.Figure 2.2 shows that TypeScript correctly understands this (Check the answer toQuestion 1.7 at the end of this book for another exampleof this):

Figure 2.2 – Hovering shows that the type of once()’s output matches the type of its input

Figure 2.2 – Hovering shows that the type of once()’s output matches the type of its input

If you’re not still used to TypeScript, let’s see the pure JavaScript equivalent, which is the same code butfor typing:

// once_JS.jsconst once = (fn) => {  let done = false;  return (...args) => {    if (!done) {      done = true;      return fn(...args);    }  };};

So, how would we use it? We first create a new version of thebilling function.

const billOnce = once(billTheUser);

Then, we rewrite theonclick methodas follows:

<button  onclick="billOnce(some, sales, data)">Bill me</button>;

When the userclicks on the button, the function that gets called with the(some, sales, data) argument isn’t the originalbillTheUser() but rather the result of having appliedonce() to it. The result of that is a function that can be called only asingle time.

You can’t always get what you want!

Note that ouronce() function uses functions such as first-class objects, arrow functions, closures, and the spread operator. Back inChapter 1,Becoming Functional, we said we’d be needing those, so we’re keeping our word! All we are missing from that chapter is recursion, but as the Rolling Stones sang,You Can’t Always Get WhatYou Want!

We now have a functional way of getting a function to do its thing only once, but how would we test it? Let’s get into thattopic now.

Testing the solution manually

We can run asimple test. Let’s write asqueak() function that will, appropriately,squeak when called! The codeis simple:

// once.manual.tsconst squeak = a => console.log(a, " squeak!!");squeak("original"); // "original squeak!!"squeak("original"); // "original squeak!!"squeak("original"); // "original squeak!!"

If we applyonce() to it, we get a new function that will squeak only once. See the highlighted line in thefollowing code:

// continued...const squeakOnce = once(squeak);squeakOnce("only once"); // "only once squeak!!" squeakOnce("only once"); // no outputsqueakOnce("only once"); // no output

The previous steps showed us how we could test ouronce() function by hand, but our method is not exactly ideal. In the next section, we’ll see why and how todo better.

Testing the solution automatically

Running tests byhand isn’t suitable: it gets tiresome and boring, and it leads, after a while, to not running the tests any longer. Let’s do better and write some automatic testswithJest:

// once.test.tsimport once } from "./once";describe("once", () => {  it("without 'once', a function always runs", () => {    const myFn = jest.fn();    myFn();    myFn();    myFn();    expect(myFn).toHaveBeenCalledTimes(3);  });  it("with 'once', a function runs one time", () => {    const myFn = jest.fn();    const onceFn = jest.fn(once(myFn));    onceFn();    onceFn();    onceFn();    expect(onceFn).toHaveBeenCalledTimes(3);    expect(myFn).toHaveBeenCalledTimes(1);  });});

There areseveral points tonote here:

  • To spy on a function (for instance, to count how many times it was called), we need to pass it as an argument tojest.fn(); we can apply tests to the result, which works exactly like the original function, but can bespied on.
  • When you spy on a function, Jest intercepts your calls and registers that the function was called, with which arguments, and how many times itwas called.
  • The first test only checks that if we call the function several times, it gets called that number of times. This is trivial, but we’d be doing something wrong if thatdidn’t happen!
  • In the second test, we applyonce() to a (dummy)myFn() function, and we call the result (onceFn()) several times. We then check thatmyFn() was called only once, thoughonceFn() was calledthree times.

We can see the results inFigure 2.3:

Figure 2.3 – Running automatic tests on our function with Jest

Figure 2.3 – Running automatic tests on our function with Jest

With that, wehave seen not only how to test our functional solution by hand but also in an automatic way, so we are done with testing. Let’s just finish by considering an even better solution, also achieved in afunctional way.

Producing an even better solution

In one of the previous solutions, we mentioned that it would be a good idea to do something every time after the first click, and not silently ignore the user’s clicks. We’ll write a new higher-order function that takes a second parameter – a function to be called every time from the second call onward. Our new function will be calledonceAndAfter() and can be writtenas follows:

// onceAndAfter.tsconst onceAndAfter = <  FNType extends (...args: any[]) => any>(  f: FNType,  g: FNType) => {  let done = false;  return ((...args: Parameters<FNType>) => {    if (!done) {      done = true;      return f(...args);    } else {      return g(...args);    }  }) as FNType;};

We have ventured further into higher-order functions;onceAndAfter() takes two functions as parameters and produces a third one, which includes the othertwo within.

Function as default

You could makeonceAndAfter() more powerful by giving a default value forg, such as() => {}, so if you didn’t specify the second function, it would still work fine because the default do-nothing function would be called instead of causingan error.

We can do a quick-and-dirty test along the same lines as we did earlier. Let’s add acreak() creaking function to our previoussqueak() one and check out what happens if we applyonceAndAfter() to them. We can then get amakeSound() function that should squeak once andcreak afterward:

// onceAndAfter.manual.tsimport { onceAndAfter } from "./onceAndAfter";const squeak = (x: string) => console.log(x, "squeak!!");const creak = (x: string) => console.log(x, "creak!!");const makeSound = onceAndAfter(squeak, creak);makeSound("door"); // "door squeak!!"makeSound("door"); // "door creak!!"makeSound("door"); // "door creak!!"makeSound("door"); // "door creak!!"

Writing a test for this new function isn’t hard, only a bit longer. We have to check which functionwas called and howmany times:

// onceAndAfter.test.tsimport { onceAndAfter } from "./onceAndAfter";describe("onceAndAfter", () => {  it("calls the 1st function once & the 2nd after", () => {    const func1 = jest.fn();    const func2 = jest.fn();    const testFn = jest.fn(onceAndAfter(func1, func2));    testFn();    testFn();    testFn();    testFn();    expect(testFn).toHaveBeenCalledTimes(4);    expect(func1).toHaveBeenCalledTimes(1);    expect(func2).toHaveBeenCalledTimes(3);  });});

Notice that wealways check thatfunc1() is called only once. Similarly, we checkfunc2(); the count of calls starts at zero (the time thatfunc1() is called), and from then on, it goes up by one oneach call.

Summary

In this chapter, we’ve seen a common, simple problem based on a real-life situation. After analyzing several typical ways of solving that, we went for a functional thinking solution. We saw how to apply FP to our problem and found a more general higher-order solution that we could apply to similar problems with no further code changes. We saw how to write unit tests for our code to round out thedevelopment job.

Finally, we produced an even better solution (from the point of view of the user experience) and saw how to code it and how to unit-test it. Now, you’ve started to get a grip on how to solve a problem functionally; next, inChapter 3,Starting Out with Functions, we’ll delve more deeply into functions, which are at the core ofall FP.

Questions

2.1No extra variables: Our functional implementation required using an extra variable,done, to mark whether the function had already been called. Not that it matters, but could you make do without using any extra variables? Note that we aren’t telling you not to use any variables, it’s just a matter of not adding any new ones, such asdone, and only asan exercise!

2.2Alternating functions: In the spirit of ouronceAndAfter() function, can you write analternator() higher-order function that gets two functions as arguments and, on each call, alternatively calls one and another? The expected behavior should be as in thefollowing example:

const sayA = () => console.log("A");const sayB = () => console.log("B");const alt = alternator(sayA, sayB);alt(); // Aalt(); // Balt(); // Aalt(); // Balt(); // Aalt(); // B

2.3Everything has a limit! As an extension ofonce(), could you write a higher-order function,thisManyTimes(fn,n), that would let you call thefn() function up ton times, but would do nothing afterward? To give an example,once(fn) andthisManyTimes(fn,1) would produce functions that behave the same way. Do also write testsfor it.

2.4Allow for crashing: Suppose we applyonce() to a function, and the first time that function gets called, it crashes. Here, we may want to allow a second call to the function, hoping it wouldn’t crash again. We want anonceIfSuccess() function, that will get a function as a parameter and produce a new function that will run successfully only once, but will be allowed to fail (throwing exceptions) many times if need be. ImplementonceIfSuccess(), and don’t forget to write unit testsfor it.

2.5Say no to arrows: Implementonce() using classic functions, instead of arrow functions. This is just meant to help you explore the slightly different needed datatyping syntax.

Left arrow icon

Page1 of 5

Right arrow icon
Download code iconDownload Code

Key benefits

  • Apply functional programming concepts and techniques to everyday JavaScript or TypeScript programming
  • Master functional programming in JavaScript and TypeScript to solve real-world development problems
  • Apply functional programming to get better testable programs with higher modularity and reusability

Description

Functional programming is a programming paradigm that uses functions for developing software. This book is filled with examples that enable you to leverage the latest JavaScript and TypeScript versions to produce modern and clean code, as well as teach you to how apply functional programming techniques to develop more efficient algorithms, write more concise code, and simplify unit testing.This book provides comprehensive coverage of the major topics in functional programming to produce shorter, clearer, and testable programs. You’ll begin by getting to grips with writing and testing pure functions, reducing side effects, as well as other key features to make your applications functional in nature. The book specifically explores techniques to simplify coding, apply recursion, perform high-level coding, learn ways to achieve immutability, implement design patterns, and work with data types.By the end of this book, you’ll have developed the practical programming skills needed to confidently enhance your applications by adding functional programming to wherever it’s most suitable.

Who is this book for?

If you are a JavaScript or TypeScript developer looking to enhance your programming skills, then this book is for you. The book applies to both frontend developers working with frameworks such as React, Vue, or Angular as well as backend developers using Node.js or Deno.

What you will learn

  • Understand when to use functional programming versus classic object-oriented programming
  • Use declarative coding instead of imperative coding for clearer, more understandable code
  • Know how to avoid side effects and create more reliable code with closures and immutable data
  • Use recursion to help design and implement more understandable solutions to complex problems
  • Define functional programing data types with or without TypeScript, add type checking, and implement immutability
  • Apply advanced containers to get better structures to tackle errors and implement async programming

Product Details

Country selected
Publication date, Length, Edition, Language, ISBN-13
Publication date :Apr 28, 2023
Length:614 pages
Edition :3rd
Language :English
ISBN-13 :9781804610411
Category :
Languages :

What do you get with eBook?

Product feature iconInstant access to your Digital eBook purchase
Product feature icon Download this book inEPUB andPDF formats
Product feature icon Access this title in our online reader with advanced features
Product feature iconDRM FREE - Read whenever, wherever and however you want
Product feature iconAI Assistant (beta) to help accelerate your learning
OR

Contact Details

Modal Close icon
Payment Processing...
tickCompleted

Billing Address

Product Details

Publication date :Apr 28, 2023
Length:614 pages
Edition :3rd
Language :English
ISBN-13 :9781804610411
Category :
Languages :
Concepts :

Packt Subscriptions

See our plans and pricing
Modal Close icon
$19.99billed monthly
Feature tick iconUnlimited access to Packt's library of 7,000+ practical books and videos
Feature tick iconConstantly refreshed with 50+ new titles a month
Feature tick iconExclusive Early access to books as they're written
Feature tick iconSolve problems while you work with advanced search and reference features
Feature tick iconOffline reading on the mobile app
Feature tick iconSimple pricing, no contract
$199.99billed annually
Feature tick iconUnlimited access to Packt's library of 7,000+ practical books and videos
Feature tick iconConstantly refreshed with 50+ new titles a month
Feature tick iconExclusive Early access to books as they're written
Feature tick iconSolve problems while you work with advanced search and reference features
Feature tick iconOffline reading on the mobile app
Feature tick iconChoose a DRM-free eBook or Video every month to keep
Feature tick iconPLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick iconExclusive print discounts
$279.99billed in 18 months
Feature tick iconUnlimited access to Packt's library of 7,000+ practical books and videos
Feature tick iconConstantly refreshed with 50+ new titles a month
Feature tick iconExclusive Early access to books as they're written
Feature tick iconSolve problems while you work with advanced search and reference features
Feature tick iconOffline reading on the mobile app
Feature tick iconChoose a DRM-free eBook or Video every month to keep
Feature tick iconPLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick iconExclusive print discounts

Frequently bought together


Mastering JavaScript Functional Programming
Mastering JavaScript Functional Programming
Read more
Apr 2023614 pages
Full star icon4.6 (14)
eBook
eBook
$35.98$39.99
$49.99
React 18 Design Patterns and Best Practices
React 18 Design Patterns and Best Practices
Read more
Jul 2023524 pages
Full star icon4.5 (19)
eBook
eBook
$31.99$35.99
$44.99
Stars icon
Total$94.98
Mastering JavaScript Functional Programming
$49.99
React 18 Design Patterns and Best Practices
$44.99
Total$94.98Stars icon

Table of Contents

16 Chapters
Chapter 1: Becoming Functional – Several QuestionsChevron down iconChevron up icon
Chapter 1: Becoming Functional – Several Questions
What is functional programming?
Why use FP?
Is JavaScript functional?
How do we work with JavaScript?
Summary
Questions
Chapter 2: Thinking Functionally – A First ExampleChevron down iconChevron up icon
Chapter 2: Thinking Functionally – A First Example
Our problem – doing something only once
A functional solution to our problem
Summary
Questions
Chapter 3: Starting Out with Functions – A Core ConceptChevron down iconChevron up icon
Chapter 3: Starting Out with Functions – A Core Concept
All about functions
Using functions in FP ways
Summary
Questions
Chapter 4: Behaving Properly – Pure FunctionsChevron down iconChevron up icon
Chapter 4: Behaving Properly – Pure Functions
Pure functions
Impure functions
Testing – pure versus impure
Summary
Questions
Chapter 5: Programming Declaratively – A Better StyleChevron down iconChevron up icon
Chapter 5: Programming Declaratively – A Better Style
Transformations
Logical HOFs
Working with async functions
Working with parallel functions
Summary
Questions
Chapter 6: Producing Functions – Higher-Order FunctionsChevron down iconChevron up icon
Chapter 6: Producing Functions – Higher-Order Functions
Wrapping functions – keeping behavior
Altering a function’s behavior
Changing functions in other ways
Summary
Questions
Chapter 7: Transforming Functions – Currying and Partial ApplicationChevron down iconChevron up icon
Chapter 7: Transforming Functions – Currying and Partial Application
A bit of theory
Currying
Partial application
Partial currying
Final thoughts
Summary
Questions
Chapter 8: Connecting Functions – Pipelining, Composition, and MoreChevron down iconChevron up icon
Chapter 8: Connecting Functions – Pipelining, Composition, and More
Pipelining
Chaining and fluent interfaces
Composing
Transducing
Testing connected functions
Summary
Questions
Chapter 9: Designing Functions – RecursionChevron down iconChevron up icon
Chapter 9: Designing Functions – Recursion
Using recursion
Mutual recursion
Recursion techniques
Summary
Questions
Chapter 10: Ensuring Purity – ImmutabilityChevron down iconChevron up icon
Chapter 10: Ensuring Purity – Immutability
Going the straightforward JavaScript way
Creating persistent data structures
Summary
Questions
Chapter 11: Implementing Design Patterns – The Functional WayChevron down iconChevron up icon
Chapter 11: Implementing Design Patterns – The Functional Way
Understanding design patterns
Object-oriented design patterns
Functional design patterns
Summary
Questions
Chapter 12: Building Better Containers – Functional Data TypesChevron down iconChevron up icon
Chapter 12: Building Better Containers – Functional Data Types
Specifying data types
Building containers
Functions as data structures
Summary
Questions
Answers to QuestionsChevron down iconChevron up icon
Answers to Questions
Chapter 1, Becoming Functional – Several Questions
Chapter 2, Thinking Functionally – A First Example
Chapter 3, Starting Out with Functions – A Core Concept
Chapter 4, Behaving Properly – Pure Functions
Chapter 5, Programming Declaratively – A Better Style
Chapter 6, Producing Functions – Higher-Order Functions
Chapter 7, Transforming Functions – Currying and Partial Application
Chapter 8, Connecting Functions – Pipelining, Composition, and More
Chapter 9, Designing Functions – Recursion
Chapter 10, Ensuring Purity – Immutability
Chapter 11, Implementing Design Patterns – The Functional Way
Chapter 12, Building Better Containers – Functional Data Types
BibliographyChevron down iconChevron up icon
Bibliography
IndexChevron down iconChevron up icon
Index
Why subscribe?
Other Books You May EnjoyChevron down iconChevron up icon
Other Books You May Enjoy
Packt is searching for authors like you
Share Your Thoughts
Download a free PDF copy of this book

Recommendations for you

Left arrow icon
Debunking C++ Myths
Debunking C++ Myths
Read more
Dec 2024226 pages
eBook
eBook
$27.99$31.99
$39.99
Go Recipes for Developers
Go Recipes for Developers
Read more
Dec 2024350 pages
eBook
eBook
$27.99$31.99
$39.99
50 Algorithms Every Programmer Should Know
50 Algorithms Every Programmer Should Know
Read more
Sep 2023538 pages
Full star icon4.5 (68)
eBook
eBook
$35.98$39.99
$49.99
Asynchronous Programming with C++
Asynchronous Programming with C++
Read more
Nov 2024424 pages
Full star icon5 (1)
eBook
eBook
$29.99$33.99
$41.99
Modern CMake for C++
Modern CMake for C++
Read more
May 2024502 pages
Full star icon4.7 (12)
eBook
eBook
$35.98$39.99
$49.99
Learn Python Programming
Learn Python Programming
Read more
Nov 2024616 pages
Full star icon5 (1)
eBook
eBook
$31.99$35.99
$39.99
Learn to Code with Rust
Learn to Code with Rust
Read more
Nov 202457hrs 40mins
Video
Video
$74.99
Modern Python Cookbook
Modern Python Cookbook
Read more
Jul 2024818 pages
Full star icon4.9 (21)
eBook
eBook
$38.99$43.99
$54.99
Right arrow icon

Customer reviews

Top Reviews
Rating distribution
Full star iconFull star iconFull star iconFull star iconHalf star icon4.6
(14 Ratings)
5 star78.6%
4 star7.1%
3 star14.3%
2 star0%
1 star0%
Filter icon Filter
Top Reviews

Filter reviews by




José Juan OjedaFeb 19, 2024
Full star iconFull star iconFull star iconFull star iconFull star icon5
Feefo Verified reviewFeefo
CDMay 15, 2023
Full star iconFull star iconFull star iconFull star iconFull star icon5
After reading Mastering JavaScript Functional Programming by Federico Kereki, I came away with a much deeper knowledge of functional JavaScript than I had previously.Admittedly, I had a cursory knowledge of functional techniques in JavaScript and have read other texts on the subject, so I was not truly comfortable using them in a professional setting.Kereki's examples are not only clear and easy-to-understand, but he also provides numerous approaches one could take before showing the best example. This is really helpful, because code is so subjective and often is easy to settle on one approach, thinking it is the best one until you see an even better one in the next paragraph! I love seeing this as it feels like you've unlocked something new and you can easily compare the best version to the other versions to see exactly why it is better.Another aspect I like about this book is that it puts a strong emphasis on testing the examples provided using Jest. This is very practical since Jest is a leading testing tool in the JavaScript world and will give one valuable experience if they have never dealt with testing frameworks before. In addition, there are many examples showing how to test pure and impure functions and how to deal with the differences.Besides being a strong test on functional approaches in JavaScript, the author sprinkles in some nice history behind JavaScript and other programming languages that provide a nice backstory to how we got here today. This makes the book both informative and fun to read.Declarative programming has been a hot topic for several years in the JavaScript world (mostly due to React) and this book covers it in great detail with very practical examples. I really appreciate that as the term is thrown around a fair bit by people, but rarely specified as clearly.There is a lot to cover in writing good, clean functional code and I think that Mastering JavaScript Functional Programming provides something for everyone at every level. The examples in this book should serve one for several years as it takes time to fully absorb and apply these concepts to real-world scenarios.I commend Federico Kereki for a terrific 3rd edition and look forward to reading more of his work in the future.
Amazon Verified reviewAmazon
matthew eldredgeMay 15, 2023
Full star iconFull star iconFull star iconFull star iconFull star icon5
"Mastering JavaScript Functional Programming" is an exceptional book that provides a comprehensive guide to mastering functional programming in JavaScript. As an experienced JavaScript developer, I found this book to be an invaluable resource for advancing my skills and understanding of functional programming concepts.The author's approach to explaining complex concepts is clear, concise, and beginner-friendly. Each chapter builds upon the previous one, gradually introducing advanced topics and demonstrating practical examples along the way. The book strikes a perfect balance between theory and hands-on exercises, making it easy to grasp the core concepts of functional programming and apply them to real-world scenarios.One of the highlights of this book is its focus on writing clean, robust, and maintainable code. The author emphasizes the importance of immutability, pure functions, and higher-order functions, guiding readers toward writing easier code to reason about, test, and debug. The code examples provided are well-explained and illustrate best practices for structuring functional JavaScript code.Additionally, the book covers a wide range of functional programming techniques, including currying, composition, recursion, and monads. These topics are explained in a practical and approachable manner, allowing readers to gain a deep understanding of their applications and benefits.The book is excellently structured, with each chapter building upon the previous one seamlessly. The writing style is engaging, and the content is presented in a logical and organized manner, making it easy to follow and digest.In conclusion, "Mastering JavaScript Functional Programming" is a must-read for JavaScript developers who want to unlock the power of functional programming. Whether you are a beginner or an experienced developer, this book will undoubtedly enhance your understanding of functional programming concepts and help you write cleaner, more maintainable code. I highly recommend it to anyone seeking to level up their JavaScript skills and embrace functional programming paradigms.
Amazon Verified reviewAmazon
Peter J. JonasMay 05, 2023
Full star iconFull star iconFull star iconFull star iconFull star icon5
A fascinating, well-written book. Although you need to experience in programming to follow, it starts at the beginning and builds up, giving you all the knowledge you need to understand and then master functional programming. Easy to read, like an enchanting fiction book.This book uses TypeScript a lot, so if you have no experience with that, it can be challenging to understand everything. Still, this is an excellent (I rate it five stars despite that) book on this topic, worth its price; just be aware of it and think through it before buying it.Then buy it. You have to know TypeScript anyway.
Amazon Verified reviewAmazon
MajdmMay 17, 2023
Full star iconFull star iconFull star iconFull star iconFull star icon5
This book has been truly helpful for me. The author's knowledge and passion were really good. This book made complex ideas easy to understand like immutability and lazy evaluation, giving me the confidence to embrace functional programming. The practical examples and code snippets helped my understanding and changed the way I code. If you want to move to more senior level in your JavaScript programming or learn more in depth about javascript, this book is a must-read.
Amazon Verified reviewAmazon
  • Arrow left icon Previous
  • 1
  • 2
  • 3
  • Arrow right icon Next

People who bought this also bought

Left arrow icon
50 Algorithms Every Programmer Should Know
50 Algorithms Every Programmer Should Know
Read more
Sep 2023538 pages
Full star icon4.5 (68)
eBook
eBook
$35.98$39.99
$49.99
Event-Driven Architecture in Golang
Event-Driven Architecture in Golang
Read more
Nov 2022384 pages
Full star icon4.9 (11)
eBook
eBook
$35.98$39.99
$49.99
The Python Workshop Second Edition
The Python Workshop Second Edition
Read more
Nov 2022600 pages
Full star icon4.6 (22)
eBook
eBook
$36.99$41.99
$51.99
Template Metaprogramming with C++
Template Metaprogramming with C++
Read more
Aug 2022480 pages
Full star icon4.6 (14)
eBook
eBook
$33.99$37.99
$46.99
Domain-Driven Design with Golang
Domain-Driven Design with Golang
Read more
Dec 2022204 pages
Full star icon4.4 (19)
eBook
eBook
$31.99$35.99
$44.99
Right arrow icon

About the author

Profile icon Federico Kereki
Federico Kereki
LinkedIn iconGithub icon
Federico Kereki is a Uruguayan Systems Engineer, with a Master's degree in Education, and over 30 years of experience as a consultant, system developer, and writer. Currently a Subject Matter Expert at Globant, he has taught at Universidad de la República, Universidad ORT Uruguay, and Universidad de la Empresa. He has written articles and booklets on programming, web development, security, and open source topics for blogs, magazines, and websites. He has also written several books, including Modern JavaScript Web Development Cookbook and the upcoming Data Structures and Algorithms in JavaScript. He resides, works, and teaches in Uruguay, but he wrote the first edition of this book while working in India, and the second edition during a sojourn in Mexico.
Read more
See other products by Federico Kereki
Getfree access to Packt library with over 7500+ books and video courses for 7 days!
Start Free Trial

FAQs

How do I buy and download an eBook?Chevron down iconChevron up icon

Where there is an eBook version of a title available, you can buy it from the book details for that title. Add either the standalone eBook or the eBook and print book bundle to your shopping cart. Your eBook will show in your cart as a product on its own. After completing checkout and payment in the normal way, you will receive your receipt on the screen containing a link to a personalised PDF download file. This link will remain active for 30 days. You can download backup copies of the file by logging in to your account at any time.

If you already have Adobe reader installed, then clicking on the link will download and open the PDF file directly. If you don't, then save the PDF file on your machine and download the Reader to view it.

Please Note: Packt eBooks are non-returnable and non-refundable.

Packt eBook and Licensing When you buy an eBook from Packt Publishing, completing your purchase means you accept the terms of our licence agreement. Please read the full text of the agreement. In it we have tried to balance the need for the ebook to be usable for you the reader with our needs to protect the rights of us as Publishers and of our authors. In summary, the agreement says:

  • You may make copies of your eBook for your own use onto any machine
  • You may not pass copies of the eBook on to anyone else
How can I make a purchase on your website?Chevron down iconChevron up icon

If you want to purchase a video course, eBook or Bundle (Print+eBook) please follow below steps:

  1. Register on our website using your email address and the password.
  2. Search for the title by name or ISBN using the search option.
  3. Select the title you want to purchase.
  4. Choose the format you wish to purchase the title in; if you order the Print Book, you get a free eBook copy of the same title. 
  5. Proceed with the checkout process (payment to be made using Credit Card, Debit Cart, or PayPal)
Where can I access support around an eBook?Chevron down iconChevron up icon
  • If you experience a problem with using or installing Adobe Reader, the contact Adobe directly.
  • To view the errata for the book, see www.packtpub.com/support and view the pages for the title you have.
  • To view your account details or to download a new copy of the book go to www.packtpub.com/account
  • To contact us directly if a problem is not resolved, use www.packtpub.com/contact-us
What eBook formats do Packt support?Chevron down iconChevron up icon

Our eBooks are currently available in a variety of formats such as PDF and ePubs. In the future, this may well change with trends and development in technology, but please note that our PDFs are not Adobe eBook Reader format, which has greater restrictions on security.

You will need to use Adobe Reader v9 or later in order to read Packt's PDF eBooks.

What are the benefits of eBooks?Chevron down iconChevron up icon
  • You can get the information you need immediately
  • You can easily take them with you on a laptop
  • You can download them an unlimited number of times
  • You can print them out
  • They are copy-paste enabled
  • They are searchable
  • There is no password protection
  • They are lower price than print
  • They save resources and space
What is an eBook?Chevron down iconChevron up icon

Packt eBooks are a complete electronic version of the print edition, available in PDF and ePub formats. Every piece of content down to the page numbering is the same. Because we save the costs of printing and shipping the book to you, we are able to offer eBooks at a lower cost than print editions.

When you have purchased an eBook, simply login to your account and click on the link in Your Download Area. We recommend you saving the file to your hard drive before opening it.

For optimal viewing of our eBooks, we recommend you download and install the free Adobe Reader version 9.


[8]ページ先頭

©2009-2025 Movatter.jp