DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

ESLint 漏报多余 bind,class 字段中的 this 不能算外层函数使用

no-extra-bind 曾把 class 字段和静态块的 this 计入外层函数,漏报多余绑定。正式修复分开作用域,但计算字段名与函数消费行为仍需单独核对。

启用 ESLint 的 no-extra-bind,外层函数没有使用自己的 this,规则却不报告多余绑定,可以检查函数内是否声明了含 this 的 class 字段或静态块。它们的 this 不属于外层函数,不能用来证明 .bind(this) 有必要。

最小代码如下:

const f = (function () {
  class C {
    field = this.x;
  }
}).bind(this);

field 在创建 C 实例时初始化,this 指向实例;类静态字段与静态块中的 this 则指向类构造器。绑定外层函数不会改变这些位置的 this。受影响规则沿 AST 访问到这些表达式时,把它们算进外层函数的 thisFound,因此漏报。

具体报告来自 ESLint Playground,使用默认 Espree;原文没有提供精确安装版本,不应把之后的发行版本写成原环境。ESLint 10.10.0 的正式发行包含 class 字段与静态块作用域处理,10.12.0 代码仍保留该处理。可采用这个固定版本进行项目回归:

npm install -D eslint@10.12.0
npm ls eslint

运行时先核对项目 Node 与插件支持范围。不要只更新编辑器扩展后便假定 CI 使用同一 ESLint。

保持规则开启,并确保语言版本允许类字段:

// eslint.config.mjs
export default [{
  languageOptions: { ecmaVersion: 'latest', sourceType: 'module' },
  rules: { 'no-extra-bind': 'error' },
}];

先对独立示例运行 npx eslint example.js。上面的外层绑定应被识别为不必要;再把示例改成外层函数直接读取自己的 this,确认那一项绑定不会同样被当成多余。类字段、静态字段与静态块可以分别作为验收样本,不能只测一个普通箭头函数。另需区分字段值与计算属性名:[this.key] 这样的类字段名称仍在外层作用域求值,可能真的需要外层绑定,不能一概忽略类里的所有 this。

如果需要修改真实业务代码,先核对绑定函数的用法。移除 bind 会影响函数对象的一些性质,例如 name、length,以及预先绑定的参数;规则对常见直接用法给出判断,并不替你证明所有反射或构造调用都无差异。不要批量删除项目中所有 .bind,也不要把类内部的 this 改成外层变量来满足 lint。

排查时还要确认最终规则配置。可用 npx eslint --print-config example.js 检查 rule 是否被覆盖,以及文件是否走预期 parser。插件包装的另一套规则、自定义 parser 或未被扫描的文件,都可能出现类似“没有报错”的表象。

这项处理针对 class 里的 this 误记到外层函数,属于规则漏报修复。升级后新增提示可能让 CI 开始失败,应查看具体绑定与函数消费方式再修改代码。若 this 确实在外层函数直接使用,保持必要绑定才是正确结果,不能把“没有 lint 提示”统一视为同一种故障。