JSFiddle - React, Tailwind, and code Playground

by Paul Draper

HTML

<table>
    <thead>
        <tr><td>Browser</td><td>apply()</td><td>eval()</td></tr>
    </thead>
    <tbody>
        <tr><td>Chrome 14</td><td>131155</td><td>32767</td></tr>
        <tr><td>Chrome 35</td><td>126213</td><td>65535</td></tr>
        <tr><td>Firefox 30</td><td>500001</td><td>65535</td></tr>
        <tr><td>IE 9</td><td>254335</td><td>65533</td></tr>
        <tr><td>IE 10</td><td>253667</td><td>65533</td></tr>
        <tr><td>IE 11</td><td>252447</td><td>65533</td></tr>
        <tr><td>Opera</td><td>126063</td><td>65535</td></tr>
        <tr><td>Safari 4</td><td>524215</td><td>524205</td></tr>
        <tr><td>Safari 7</td><td>65537</td><td>522159</td></tr>
        <tr><td>Current browser</td><td id="apply-result">...</td><td id="eval-result">...</td></tr>
    </tbody>
</table>

CSS

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

thead {
    font-weight: bold;
    text-align: center;
}

tr:last-child {
    font-style: italic;
}

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);