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