JSFiddle - React, Tailwind, and code Playground

by Paul Draper

HTML

<table>
    <tr><td>.apply()</td><td id="apply-result">...</td></tr>
    <tr><td>literal</td><td id="eval-result">...</td></tr>
</table>

CSS

table {
    border-collapse: collapse;
    font-family: sans-serif;
    font-size: 16px;
    text-align: center;
}

td {
    border: 1px solid black;
    padding: 10px;
}

JavaScript

function repeat(val, n) {
    var array = [];
    while(--n >= 0) {
      array.push(val);
    }
    return array;
}

function throwsException(f) {
    try {
        f();
        return false;
    } catch(e) {
        return true;
    }
}

function canApply(n) {
    var array = repeat(0, n);
    return !throwsException(function() {
        (function() {}).apply(null, array);
    });
}

function canEval(n) {
    var code = '(function() {})(' + repeat('0', n).join(',') + ')';
    return !throwsException(function() {
        eval(code);
    });
}

function find(f) {
  for(var high = 1; high < 1e7 && f(high); high *= 2); 
  var mid;
  for(var low = high-- / 2; low < high; ) {
    mid = (low + high + 1) / 2;
    if(f(mid)) {
      low = mid;
    } else {
      high = mid - 1;
    }
  }
  return mid;
}

setTimeout(function() {
    document.getElementById('apply-result').innerHTML = find(canApply).toString();
}, 0);
setTimeout(function() {
    document.getElementById('eval-result').innerHTML = find(canEval).toString();
}, 0);