JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://github.com/najamelan/TidBits_Javascript_OoJs/raw/master/oojs.js"></script>

JavaScript

// This is code for an answer to the SO question: https://stackoverflow.com/questions/22825628/alternatives-to-deep-nesting-functions-javascript/22851466#22851466


// include OoJs
//
var OoJs = TidBits.OoJs

// Create your namespace to avoid polluting global
//
var eComm = eComm || {}


// this will be some factory code which will return the needed objects, it won't actually use them.
// Normally this should be a class to living in our eComm namespace
//
function factory( db, clientID )
{
   // we would assume here that the hardcoded rates would be found in the database using the client id.
   //
   var discount = new eComm.Discount( 5            ) // in %
   var profit   = new eComm.Profit  ( 20, discount ) // in %
   var taxRate  = new eComm.TaxRate ( 5 , profit   ) // in %


   // note that I use a simple aggragation approach, because I don't know the
   // actual complexity of your problem domain. It makes this very simple ecommerce
   // code not entirely ideal. If we would just perform a chain of operations on
   // a number, other design patterns would be more suited, like a decorator.
   // It is not appropriate to just pass taxRate to Invoice, because it is no different
   // than profit or discount, it just comes later in a chain of calculations.
   // I have taken this approach to show that it is possible to hide steps of the
   // implementation down a hierarchy.
   //
   return new eComm.Invoice ( taxRate )
}


// now when we will actually use it, it looks like this
// wrapped it in a function call because on global scope
// we would have to put this entirely at the bottom
// if you put all your code in classes you don't have this
// problem. They can occur in any order
//
function usage()
{
   var invoice = factory( "database", 1654 /* the client id */ )

   invoice.addPurchase( 1574 ) // price in some currency
   invoice.addPurchase( 1200 ) // a second purchase


   // in reality you would probably also pass an object representing an output...