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