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
$49.99
Full star iconFull star iconFull star iconFull star iconHalf star icon4.6(14 Ratings)
PaperbackApr 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 Print?

Product feature iconInstant access to your digital copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Redeem a companion digital copy on all Print orders
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

Shipping Address

Billing Address

Shipping Methods
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
Estimated delivery feeDeliver to Ecuador

Standard delivery10 - 13 business days

$19.95

Premium delivery3 - 6 business days

$40.95
(Includes tracking information)

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 :9781804610138
Category :
Languages :

What do you get with Print?

Product feature iconInstant access to your digital copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Redeem a companion digital copy on all Print orders
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

Shipping Address

Billing Address

Shipping Methods
Estimated delivery feeDeliver to Ecuador

Standard delivery10 - 13 business days

$19.95

Premium delivery3 - 6 business days

$40.95
(Includes tracking information)

Product Details

Publication date :Apr 28, 2023
Length:614 pages
Edition :3rd
Language :English
ISBN-13 :9781804610138
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

What is the digital copy I get with my Print order?Chevron down iconChevron up icon

When you buy any Print edition of our Books, you can redeem (for free) the eBook edition of the Print Book you’ve purchased. This gives you instant access to your book when you make an order via PDF, EPUB or our online Reader experience.

What is the delivery time and cost of print book?Chevron down iconChevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium:Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela
What is custom duty/charge?Chevron down iconChevron up icon

Customs duty are charges levied on goods when they cross international borders. It is a tax that is imposed on imported goods. These duties are charged by special authorities and bodies created by local governments and are meant to protect local industries, economies, and businesses.

Do I have to pay customs charges for the print book order?Chevron down iconChevron up icon

The orders shipped to the countries that are listed under EU27 will not bear custom charges. They are paid by Packt as part of the order.

List of EU27 countries:www.gov.uk/eu-eea:

A custom duty or localized taxes may be applicable on the shipment and would be charged by the recipient country outside of the EU27 which should be paid by the customer and these duties are not included in the shipping charges been charged on the order.

How do I know my custom duty charges?Chevron down iconChevron up icon

The amount of duty payable varies greatly depending on the imported goods, the country of origin and several other factors like the total invoice amount or dimensions like weight, and other such criteria applicable in your country.

For example:

  • If you live inMexico, and the declared value of your ordered items is over $ 50, for you to receive a package, you will have to pay additional import tax of 19% which will be $ 9.50 to the courier service.
  • Whereas if you live inTurkey, and the declared value of your ordered items is over € 22, for you to receive a package, you will have to pay additional import tax of 18% which will be € 3.96 to the courier service.
How can I cancel my order?Chevron down iconChevron up icon

Cancellation Policy for Published Printed Books:

You can cancel any order within 1 hour of placing the order. Simply contact customercare@packt.com with your order details or payment transaction id. If your order has already started the shipment process, we will do our best to stop it. However, if it is already on the way to you then when you receive it, you can contact us at customercare@packt.com using the returns and refund process.

Please understand that Packt Publishing cannot provide refunds or cancel any order except for the cases described in our Return Policy (i.e. Packt Publishing agrees to replace your printed book because it arrives damaged or material defect in book), Packt Publishing will not accept returns.

What is your returns and refunds policy?Chevron down iconChevron up icon

Return Policy:

We want you to be happy with your purchase from Packtpub.com. We will not hassle you with returning print books to us. If the print book you receive from us is incorrect, damaged, doesn't work or is unacceptably late, please contact Customer Relations Team on customercare@packt.com with the order number and issue details as explained below:

  1. If you ordered (eBook, Video or Print Book) incorrectly or accidentally, please contact Customer Relations Team on customercare@packt.com within one hour of placing the order and we will replace/refund you the item cost.
  2. Sadly, if your eBook or Video file is faulty or a fault occurs during the eBook or Video being made available to you, i.e. during download then you should contact Customer Relations Team within 14 days of purchase on customercare@packt.com who will be able to resolve this issue for you.
  3. You will have a choice of replacement or refund of the problem items.(damaged, defective or incorrect)
  4. Once Customer Care Team confirms that you will be refunded, you should receive the refund within 10 to 12 working days.
  5. If you are only requesting a refund of one book from a multiple order, then we will refund you the appropriate single item.
  6. Where the items were shipped under a free shipping offer, there will be no shipping costs to refund.

On the off chance your printed book arrives damaged, with book material defect, contact our Customer Relation Team on customercare@packt.com within 14 days of receipt of the book with appropriate evidence of damage and we will work with you to secure a replacement copy, if necessary. Please note that each printed book you order from us is individually made by Packt's professional book-printing partner which is on a print-on-demand basis.

What tax is charged?Chevron down iconChevron up icon

Currently, no tax is charged on the purchase of any print book (subject to change based on the laws and regulations). A localized VAT fee is charged only to our European and UK customers on eBooks, Video and subscriptions that they buy. GST is charged to Indian customers for eBooks and video purchases.

What payment methods can I use?Chevron down iconChevron up icon

You can pay with the following card types:

  1. Visa Debit
  2. Visa Credit
  3. MasterCard
  4. PayPal
What is the delivery time and cost of print books?Chevron down iconChevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium:Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela

[8]ページ先頭

©2009-2025 Movatter.jp