JavaScript 在线运行
写 JS 点运行,捕获 console.log/error/warn 输出并显示运行时长
用 new Function 执行,捕获 console 输出,不离开浏览器。
JavaScript 在线运行:执行环境、console 捕获与安全边界
代码是怎么被执行的
工具把输入的代码交给 new Function 构造一个函数并执行。这种方式的特点是:
- 代码在当前页面的 JS 环境里运行,不是独立的沙箱。它可以直接访问
window、document、localStorage、location,也能发起网络请求。 - 不经过解析器预处理,所以语法错误会以异常形式抛出并被捕获显示。
- 代码在严格模式之外按普通脚本执行(取决于实现),
this的指向与浏览器脚本一致。
这带来一个必须说清的边界,见下面的安全一节。
console 输出是怎么被抓到的
工具临时替换了 console.log、console.error、console.warn 等方法的实现,把参数收集起来显示在输出区。实际含义:
| 情况 | 表现 |
|---|---|
console.log('a', 1) | 按顺序拼接显示 |
console.log({a:1}) | 取决于实现,可能显示为 [object Object];稳妥写法是 JSON.stringify(obj, null, 2) |
console.table / console.group | 通常不被捕获,需要用 log 替代 |
| 浏览器控制台的原始输出 | 仍然可用(开发者工具里能看到),捕获只是额外收集了一份 |
另外工具会显示执行时长,用来大致判断操作的量级(比如比较两种算法、确认某个循环能否接受)。注意这只是单次运行的墙钟时间,受 JIT 预热与当前负载影响,不能当作基准测试——测性能应该在控制台里跑多次取中位数,或者用专门的基准工具。
异步代码的处理
这类工具对异步的支持通常是有限的:
setTimeout里的输出可能不显示。因为代码执行结束后输出区可能已经定稿,之后才触发的回调写进去的内容未必被收集。稳妥做法是把异步逻辑包在立即执行的 async 函数里,并确保在输出前await完成。- Promise 的拒绝(rejection)未必被捕获,可能表现为"没有输出"而不是报错。写异步代码时用
try/catch包住。 - 要等待的异步任务需要用
await,而不是依赖工具去等。
安全边界:这是一条明确的纪律
因为代码在页面上下文里直接执行,它能访问这个站点的存储与网络。虽然本站没有账号体系、不保存个人数据,风险有限,但纪律仍然成立:
- 不要运行来源不明的代码片段。从论坛、聊天记录、gist 里复制来的"试试这个"完全可能包含读取存储或发起请求的逻辑。
- 不要在代码里写真实的密钥、token、密码。它们会进入这个页面环境,也可能被网络日志记录。测试时用假值。
- 需要运行不可信代码时,用 HTML 运行工具(它基于 iframe,隔离性更好),或者用浏览器开发者工具的 Snippets、以及独立的 Node 环境。
如果只是想安全地试一段不涉及敏感数据的算法,这个工具很方便;涉及凭证或不可信来源时,选隔离更好的方式。
典型用途
- 验证一段逻辑:日期计算、字符串处理、正则匹配、数组变换的写法是否符合预期。
- 试探 API 行为:
JSON.parse对边界输入的反应、Intl格式化结果、Array.sort的稳定性与比较函数。 - 格式化数据:把一段 JSON 用脚本整理成需要的形式,比手工处理可靠。
- 写一次性转换脚本:把 CSV 文本转成想要的代码片段,粘贴到输出区再取走。
- 调试表达式:把复杂表达式拆开,逐段
console.log看中间值。
全部在浏览器本地执行,代码不上传。
常见问题
为什么不能用 const/let 顶层?
代码包在 new Function 的函数体里,const/let 在函数作用域内完全可用;但 return 等语句需用函数写法。