JavaScript 演练场
写一段 JavaScript 在浏览器本地执行:代码跑在临时 Worker 里,捕获 console 的 log/warn/error 输出、显示 return 返回值,支持 1 至 10 秒超时与手动中止,死循环不会卡住页面,全程不发任何请求。
代码跑在哪个环境里
每次运行都新建一个 <code>Worker</code>,代码在那里执行,所以死循环不会卡住页面,超时后直接被丢弃 —— 这一点比在页面里直接 <code>eval</code> 强得多。
Worker 里没有 DOM、没有 <code>window</code>,也拿不到页面的变量;<code>fetch</code>、<code>XMLHttpRequest</code>、<code>localStorage</code> 同样不可用。要做这些请回自己的项目里跑。
输出是怎么来的
接管了 Worker 里的 <code>console</code>,四个级别(log / info / warn / error)都会按调用顺序进输出区,字符串参数原样打印、其它参数用 JSON 风格展开。
<code>return</code> 的返回值不算 console 输出,会以 <code>=></code> 开头单独一行,方便看函数结果。
常见差异
现代浏览器的 ES2020 之后语法都能用,<code>await</code> 也可以直接写在顶层(代码被包在 async 函数里);但 Worker 全局没有 <code>document</code>,任何 <code>document.getElementById</code> 都会抛 <code>ReferenceError</code>。
<code>setTimeout</code> 是异步的:代码主体跑完就返回了,后面排队的定时器要等 Worker 被复用或页面刷新才可能执行 —— 想看到定时器输出,要么 <code>await</code>,要么在末尾 <code>return</code> 一个 Promise。
常见问题
代码会上传吗?
不会。代码先被拼成一个 Blob URL 交给本页创建的 Worker,全程不离开浏览器,关掉页面就没了。
超时是怎么算的?
从点运行开始计时(不含拼 Worker 的时间),到点直接把 Worker 终止掉。终止后里面排队的定时器与 Promise 全部作废,不会再往输出区追加内容。
为什么访问不了 DOM?
Worker 里没有 document,这是浏览器的隔离设计。要跑页面相关的代码请在自己的项目里用 iframe + postMessage,或直接开控制台。