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...