stack size

Level or recursion depending on amount of local variables

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<div id="result1">Recursion levels via simple call: <span id="result1-data"></span></div>
<div id="result2">Recursion levels via fuction.call: <span id="result2-data"></span></div>
<canvas id="chart" width="400" height="400"></canvas>

CSS

#result1, #result2 {
    font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
}
#result1 {
    color: rgb(151, 187, 205);
}
#result2 {
    color: rgb(151, 205, 187);
}

JavaScript

var level = 0;

var recurse0 = function() {
  level++;
  recurse0();
};

var levelFns = [
  recurse0,

  function recurse1(fn) {
    level++;
    fn(fn);
  },

  function recurse2(fn, a1) {
    level = level + a1;
    fn(fn, 1);
  },

  function recurse3(fn, a1, a2) {
    level = level + a2 - a1;
    fn(fn, 1, 2);
  },

  function recurse4(fn, a1, a2, a3) {
    level = level + a3 - a2 - a1;
    fn(fn, 1, 2, 4);
  },

  function recurse5(fn, a1, a2, a3, a4) {
    // make JS engine think that all parameters are used
    // in fact it is still the same `level = level + 1`
    level = level + a4 - a3 - a2 - a1;
    fn(fn, 1, 2, 4, 8);
  }
];

var recurse0Call = function() {
  level++;
  recurse0Call.call(this);
};

var levelFnsCall = [
  recurse0Call,

  function recurse1(fn) {
    level++;
    fn.call(this, fn);
  },

  function recurse2(fn, a1) {
    level = level + a1;
    fn.call(this, fn, 1);
  },

  function recurse3(fn, a1, a2) {
    level = level + a2 - a1;
    fn.call(this, fn, 1, 2);
  },

  function recurse4(fn, a1, a2, a3) {
    level = level + a3 - a2 - a1;
    fn.call(this, fn, 1, 2, 4);
  },

  function recurse5(fn, a1, a2, a3, a4) {
    level = level + a4 - a3 - a2 - a1;
    fn.call(this, fn, 1, 2, 4, 8);
  }
];

function getRecursionLevels(levels, labels, fns) {
  for (var i = 0; i < fns.length; i++) {
    var fn = fns[i];
    try {
      level = 0;
      // initial call
      fn(fn, 1, 2, 4, 8);
    } catch (e) {
      levels[i] = level;
      labels[i] = '' + i;
    }
  }
}

function showResultNumbers(result, levels) {
  result.innerHTML = levels.join(' ');
  console.log(levels);
}

var result1 = document.getElementById('result1-data'),
  levels1 = [],
  labels1 = [];

var result2 = document.getElementById('result2-data'),
  levels2 = [],
  labels2 = [];

var warmUpIterations = 100,
  i;

// warm up for Firefox
for (i = 0; i < warmUpIterations; i++) {
  getRecursionLevels(levels1, labels1, levelFns);
  if (i === 0) console.log('First run simple...