# @freecodecamp/loop-protect 中文文档

规范地址：https://npmcn.com/package/%40freecodecamp/loop-protect/

版本：3\.0\.0
npm 元数据更新时间：2024-04-05T07:41:35.281Z
中文译文更新时间：2026-11-15T12:55:53.355Z
软件包许可：未声明

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40freecodecamp/loop-protect
原文对照：https://npmcn.com/package/%40freecodecamp/loop-protect/?lang=original
项目主页：https://github.com/freeCodeCamp/loop-protect
源码仓库：https://github.com/freeCodeCamp/loop-protect

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：15.8 kB，4 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：0 个
- 首次发布：2019-12-11T17:01:48.732Z
- 最新版本发布：2022-07-08T10:01:49.515Z
- 近 30 天下载量：15142（2026-10-16 至 2026-11-14，npm 官方下载统计）
- 已发布版本数：4（近 12 个月 0 个）

## 中文简介

在动态 val'd JavaScript 中防止无限回路和再起.

## 安装

```sh
npm install @freecodecamp/loop-protect
```

也可以使用：`pnpm add @freecodecamp/loop-protect`、`yarn add @freecodecamp/loop-protect`、`bun add @freecodecamp/loop-protect`

## README

[![Test status](https://api.travis-ci.org/jsbin/loop-protect.svg?branch=master)](https://travis-ci.org/jsbin/loop-protect)

# 循环保护

JS Bin的循环保护执行作为可再使用的库.

此代码保护用户代码包含一个使用 a 的无限循环的用户 `while`, (中文(简体) ), `for` 或者说 `do` 循环。 它还防止当一个React 组件本身引用时产生无限循环.

注意这一点 _没有_ 解决 [停止问题](http://en.wikipedia.org/wiki/Halting_problem) 但简单地重写了JavaScript(使用 Babel 的 AST) 以有条件的断开来包裹循环. 这个也是 _没有_ 防止一般的循环循环,只是反应组件.

## 示例

随着循环保护的到位,这意味着用户可以在JS Bin上输入以下代码,以及最终的 `console.log` 还会继续工作.

代码从这里转换:

```js
while (true) {
  doSomething();
}

console.log('All finished');
```

...为了这个:

```js
var _LP = Date.now();
while (true) {
  if (Date.now() - _LP > 100)
    break;

  doSomething();
}

console.log('All finished');
```

## 使用量

循环保护是一种babel变换,因此可以用于服务器或客户端.

上一个执行使用一个被注入的库来处理跟踪回路 - 此版本没有.

### 实例(客户)实施

```js
import Babel from 'babel-standalone';
import protect from 'loop-protect';

const timeout = 100; // defaults to 100ms
Babel.registerPlugin('loopProtection', protect(timeout));

const transform = source => Babel.transform(source, {
  plugins: ['loopProtection'],
}).code;

// rewrite the user's JavaScript to protect loops
var processed = transform(getUserCode());

// run in an iframe, and expose the loopProtect variable under a new name
var iframe = getNewFrame();

// append the iframe to allow our code to run as soon as .close is called
document.body.appendChild(iframe);

// open the iframe and write the code to it
var win = iframe.contentWindow;
var doc = win.document;
doc.open();

doc.write('<script>' + processed + '<' + '/script>');
doc.close();

// code now runs, and if there's an infinite loop, it's cleanly exited
```

### 可选的第二个参数

在上述执行中,当由回路保护转换的代码包含无限回路时,回路会用一个回路清洁地退出 `break` 语句,循环后的任何代码通常都会被执行。 见 [实例](https://github.com/jsbin/loop-protect#example)。 。 。 .

但如果你想登录一个错误到控制台以警告用户,或者扔出一个错误,以便在遇到无限循环时停止执行呢? 这个 `protect` 函数需要可选的第二个参数,可以处理两种行为.

1.  要登录一个错误到控制台, 但循环后继续执行, 通过 `protect` 字符串作为第二个参数。 当遇到无限回路时,此字符串将被登录 `console.error()`,让用户知道他们的错误.
    
2.  要抛出错误并停止执行,通过 `protect` 简单的回调函数,该函数会丢出新的错误。 注意,如果您使用 `line` 参数,您可以用一个模板字元来表示更具体的错误消息。 例如:
    

```js
import Babel from 'babel-standalone';
import protect from 'loop-protect';

const callback = line => {
  throw new Error(`Bad loop on line ${line}`);
};

const timeout = 100;
Babel.registerPlugin('loopProtection', protect(timeout, callback));

const transform = source => Babel.transform(source, {
  plugins: ['loopProtection'],
}).code;
  
var processed = transform(getUserCode());

// do more stuff with processed code here
```

通过执行,将产生以下结果:

```js
while (true) {
  doSomething();
}

console.log('All finished'); // does not execute

// Error: Bad loop on line 1
```

### 可选的第三个参数

如果你的代码涉及一个大但有限的环数,你可以使用第三个 参数, `iterations`,提高性能. `Date.now()` 比较贵 操作,每次检查一次 `iterations` 穿过一圈.

与 `iterations = 100` 初始代码变为

```js
var _LPC = 1;
var _LP = Date.now();
while (true) {
  if (_LPC++ % 100 === 0 && Date.now() - _LP > 100)
    break;

  doSomething();
}

console.log('All finished');
```

跳过第一个 `Date.now()` 调用, 并仅检查是否循环 每100个路口跑一次太长了.

## 贡献者

-   作者 : [莱米·夏普](https://github.com/remy)
-   [所有贡献者](https://github.com/jsbin/loop-protect/graphs/contributors)

## 许可证

麻省理工学院/ [http://jsbin.mit-license.org (中文(简体) )](http://jsbin.mit-license.org/)

## 常见问题

### @freecodecamp/loop-protect 是什么？

在动态 val'd JavaScript 中防止无限回路和再起\.

### 如何安装 @freecodecamp/loop-protect？

在项目目录运行 npm install @freecodecamp/loop-protect，或使用 pnpm add / yarn add / bun add。

### @freecodecamp/loop-protect 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/freecodecamp\_\_loop-protect 是否存在。

### @freecodecamp/loop-protect 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @freecodecamp/loop-protect 可以商用吗？

@freecodecamp/loop-protect 使用 未声明 许可。package\.json 没有声明许可证。没有许可证的代码默认保留全部权利，商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括，不构成法律意见，请以许可原文为准。

### @freecodecamp/loop-protect 的下载量有多少？

根据 npm 官方下载统计，@freecodecamp/loop-protect 在 2026/10/16 – 2026/11/14 这 30 天内被下载 15,142 次，日均约 505 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @freecodecamp/loop-protect 还在维护吗？

最新版本 3\.0\.0 发布于 2022/07/08（4 年前）；至今共发布 4 个版本，其中过去 12 个月发布了 0 个；首次发布于 2019/12/12。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

