首页 > 工具箱 > 在线运行代码

在线运行代码

想验证一段 JavaScript 到底输出什么,不用开编辑器也不用打开控制台。代码在浏览器的 Web Worker 沙箱里跑,console 输出、返回值、异常和耗时都会列出来;写死循环也不怕,超时会被强制终止。另一个页签可以把 HTML、CSS、JS 拼起来实时预览,改完直接导出成一个 HTML 文件。

控制台

说明

代码跑在哪里
JavaScript 那一栏跑在你自己浏览器的 Web Worker 里,不经过服务器,所以代码和数据都不会外传,也没有排队和额度限制。Worker 是独立线程,写死循环不会把页面卡住,超时后直接 terminate() 强制终止,这一点是 evalsetTimeout 做不到的。
哪些东西在 Worker 里用不了
Worker 没有 DOM,所以 documentwindowalert 都不存在,写了会直接报 ReferenceError;需要操作 DOM 请换到「HTML / CSS / JS 预览」那个页签。可以用的有 fetchXMLHttpRequestsetTimeoutcryptoTextEncoderIndexedDB 等;fetch 受同源策略限制,跨域请求需要对方站点允许 CORS。
顶层 await 和 return
你的代码会被包进一个 async 函数体里执行,所以可以直接写 await,也可以用 return 把结果交出来——返回值会单独显示在输出的最后一行。如果最后一个表达式没有 return,不会自动当成返回值,这一点和浏览器控制台不一样,需要显式写。
输出是怎么格式化的
console.log 的每个参数都会被递归展开:对象和数组最多展开 5 层,再深就折叠成 [Object];循环引用显示成 [Circular]MapSetDateRegExpError、函数、SymbolBigInt 都有各自的写法。数组和对象超过 200 个元素时只显示前 200 个,避免一条日志刷爆页面。
预览页签的沙箱
预览用的 iframe 加了 sandbox="allow-scripts",没有开 allow-same-origin,因此预览页拿不到本站的 Cookie 和 localStorage,也访问不了父页面的 DOM。预览页里的 console 输出和未捕获异常会通过 postMessage 转发到下面那块黑色区域。要注意 alertconfirmprompt 在沙箱里被禁用了,调试请改用 console.log
导出的 HTML 能直接用吗
可以。导出的是一个自包含的单文件:CSS 放在 <style> 里,JS 放在 <body> 末尾的 <script> 里,双击就能在浏览器打开,也可以直接丢到服务器上。转发控制台用的那段注入脚本不会写进导出文件。
相关工具
JS 格式化与压缩JSON 格式化正则表达式测试HTML 格式化CSS 格式化
已复制