ESLint no-caller 规则深度解析:禁用 arguments.caller 与 arguments.callee

发布时间:2026/9/12 7:30:04

ESLint no-caller 规则深度解析:禁用 arguments.caller 与 arguments.callee ESLint no-caller 规则深度解析禁用 arguments.caller 与 arguments.callee【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslintno-caller是 ESLint 内置的suggestion类规则用于在 JavaScript 代码中拦截对已废弃的arguments.caller与arguments.callee属性的访问。本文以 ESLint 仓库中该规则的 官方文档 为骨架结合 规则源码 与其 单元测试完整讲解该规则的触发条件、边界行为、配置方式与底层实现帮助你理解为何要禁止这两个属性以及如何在项目中正确开启并替换这类写法。背景为什么arguments.caller与arguments.callee需要被禁用每个非箭头函数内部都隐式存在一个arguments对象用于保存实际传入的实参。历史上这个对象上还挂着两个特殊的属性arguments.callee指向当前正在执行的函数本身arguments.caller指向调用当前函数的那个函数如果存在。它们曾经被用来实现匿名函数递归、调用栈回溯等技巧但代价是让引擎无法对函数做尾调用优化、内联优化等多项代码优化因此它们已在新版 JavaScript 规范中被标记为废弃deprecated在 ECMAScript 5 的严格模式strict mode下访问arguments.caller和arguments.callee会被直接判定为语法错误并抛错。例如下面这段代码在严格模式下根本无法运行function foo() { const callee arguments.callee; // TypeError / SyntaxError }ESLint 的no-caller规则正是为了在编码阶段就阻止这类“既阻碍优化、又会在严格模式下直接崩溃”的废弃写法进入代码库。规则元信息在 lib/rules/no-caller.js 中定义如下type: suggestion属于建议类规则不会造成运行时错误但强烈建议修改recommended: false未包含在eslint:recommended预设中需要开发者显式开启schema: []规则不接收任何配置选项。Rule Details规则何时触发、何时放行根据官方文档的说明本规则的目标是“劝阻使用已废弃且次优的代码”做法是禁止使用arguments.caller和arguments.callee只要代码中出现对这两个属性的访问规则就会报告警告。结合 lib/rules/no-caller.js 的实现触发条件可以精确拆解为出现了一个MemberExpression成员表达式成员表达式的对象名node.object.name严格等于arguments该成员访问不是计算属性形式即代码写的是arguments.callee而非arguments[callee]源码中通过!node.computed判断属性名node.property.name匹配正则/^calle[er]$/u即恰好是caller或callee。一旦命中规则会报告一条消息消息模板为Avoid arguments.{{prop}}.其中{{prop}}会被替换成实际访问的属性名因此报告文案是Avoid arguments.caller.Avoid arguments.callee.什么是不应该被误报的合法用法arguments对象上还有其他完全合法的属性本规则不会误伤arguments.length实参个数arguments[0]、arguments[n]按索引访问实参整个arguments对象本身的传递。这一点在 tests/lib/rules/no-caller.js 的valid用例中得到了直接印证var x arguments.length; // 合法 var x arguments; // 合法 var x arguments[0]; // 合法 var x arguments[caller] // 合法caller 是变量名且属于计算属性访问注意最后一个用例arguments[caller]中的caller只是一个普通变量访问的是arguments对象上名为该变量值的动态属性与arguments.caller语义完全不同因此不触发规则。不正确的代码示例官方文档给出了两类典型的不正确写法一种是直接使用arguments.callee实现匿名函数递归另一种是在数组遍历回调中借助arguments.callee计算阶乘。它们都应被规则拦截/*eslint no-caller: error*/ function foo(n) { if (n 0) { return; } arguments.callee(n - 1); // 报错Avoid arguments.callee. } [1,2,3,4,5].map(function(n) { return !(n 1) ? 1 : arguments.callee(n - 1) * n; // 报错Avoid arguments.callee. });正确的代码示例现代替代写法修复方式非常直接给函数一个名字然后直接用函数名递归彻底摆脱对arguments.callee的依赖/*eslint no-caller: error*/ function foo(n) { if (n 0) { return; } foo(n - 1); // 直接使用函数名递归 } [1,2,3,4,5].map(function factorial(n) { return !(n 1) ? 1 : factorial(n - 1) * n; // 命名函数表达式 });第一处用具名函数foo自递归第二处把匿名回调改为命名函数表达式named function expression在函数体内通过名字factorial引用自身。两种写法都移除了arguments.callee且完全兼容严格模式也便于引擎优化。Options本规则没有任何配置项官方文档明确说明This rule has no options.此规则没有选项。这一点在源码中同样有据可查schema: []见 lib/rules/no-caller.js表示规则既不接受选项对象也不支持数组形式的配置参数。因此配置时只能使用off/warn/error三档严重级别任何额外传入的选项都会被 ESLint 判定为配置错误。源码实现解析规则如何在 AST 上工作规则实现位于 lib/rules/no-caller.js全文结构非常精简一个meta块定义元信息一个create(context)返回 AST 访问器。create(context) { return { MemberExpression(node) { const objectName node.object.name, propertyName node.property.name; if ( objectName arguments !node.computed propertyName propertyName.match(/^calle[er]$/u) ) { context.report({ node, messageId: unexpected, data: { prop: propertyName }, }); } }, }; }值得注意的实现细节只监听MemberExpression节点规则并不关心arguments.callee出现在什么语句里赋值、调用、返回值均可只要 AST 中出现arguments.caller/arguments.callee形式的成员访问就会被捕获正则/^calle[er]$/u的精妙之处calle[er]恰好同时覆盖caller和callee两种拼写callee以e结尾caller以r结尾不检查计算属性arguments[callee]这种写法属于动态访问规则的检查范围刻意限定在静态的点号访问形式报告使用messageId机制消息文案统一维护在meta.messages中unexpected: Avoid arguments.{{prop}}.通过data.prop动态填充属性名方便 i18n 与消息复用。此外规则通过 lib/rules/index.js 中的no-caller: () require(./no-caller)懒加载注册与其他 300 余条内置规则一样随 ESLint 分发无需安装任何插件。测试用例验证规则行为的完整规格单元测试 使用RuleTester对规则行为做了精确的规格化描述可作为规则行为的“可执行文档”合法用例validarguments.length、裸arguments、arguments[0]、arguments[caller]变量形式均不报错非法用例invalidarguments.callee与arguments.caller各触发一条unexpected消息且data.prop分别为callee、caller。invalid: [ { code: var x arguments.callee, errors: [{ messageId: unexpected, data: { prop: callee } }] }, { code: var x arguments.caller, errors: [{ messageId: unexpected, data: { prop: caller } }] }, ]在仓库中运行对应的规则测试即可验证npx mocha tests/lib/rules/no-caller.js如何在项目中启用 no-caller由于recommended: false该规则不会随eslint:recommended自动生效需要显式配置。在基于 flat config 的eslint.config.js中// eslint.config.js export default [ { rules: { no-caller: error, }, }, ];在传统.eslintrc风格配置中{ rules: { no-caller: error } }建议与no-eval、no-implied-eval等规则配合使用共同约束代码中对“动态执行与运行时反射”类特性的滥用。使用边界与注意事项严格模式下是硬性错误在use strict代码中访问arguments.callee会直接抛出TypeErrorno-caller能帮助你在运行前发现这类隐患Function.prototype.caller/callee不在检查范围内本规则只匹配arguments对象上的这两个属性。通过函数对象的fn.caller等反射访问属于另一类问题需要其他手段治理arguments.callee.caller等链式访问同样会命中只要成员表达式的对象是arguments、属性名匹配无论外层还嵌套了多少层.caller都会被报告不要用计算属性绕过规则虽然arguments[callee]当前不会被本规则拦截但它在严格模式下同样是禁用行为应从代码规范层面一并杜绝。总结no-caller是一条小而美的规则文档仅短短数段源码不足 60 行测试用例清晰覆盖了边界行为。它通过 AST 层面的精确匹配把两个“历史遗留、阻碍优化、严格模式即崩溃”的废弃属性挡在代码库之外。理解了它的触发条件arguments 非计算属性 caller/callee与替代方案具名函数自递归你就能在代码评审与日常开发中快速识别并修正这类写法。相关资源规则文档docs/src/rules/no-caller.md规则实现lib/rules/no-caller.js单元测试tests/lib/rules/no-caller.js规则注册lib/rules/index.js【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 7:30:04

恶意文件如何被 claude-obsidian 的归档防御逐关击退

恶意文件如何被 claude-obsidian 的归档防御逐关击退 【免费下载链接】claude-obsidian Self-organizing AI second brain for Obsidian Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own.…

2026/9/12 7:30:04

锂电池组SOC均衡控制与Buck-Boost电路设计

1. 项目背景与核心价值锂电池组在电动汽车、储能系统等领域的应用越来越广泛,但电池单体之间的不一致性问题始终是影响系统性能和寿命的关键因素。四节电池组作为最常见的电池模块单元,其均衡控制技术的研究具有典型意义。基于SOC(State of C…

2026/9/12 8:15:09

CPU、内存、硬盘:电脑硬件三件套的分工与协作原理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 8:15:09

SNMP协议栈选型:Net-SNMP与国产自研在信创迁移中的实战对比

SNMP这东西,平时不显山不露水,一旦碰上设备纳管、网络监控、平台对接,它就是绕不过去的那道坎。这个标题里几个关键词——SNMP协议栈、SNMP SDK、Net-SNMP、国产自研、信创,我基本都折腾过,尤其最近两年做信创环境下的…

2026/9/12 8:15:09

基于Matlab的手指手掌静脉识别实现与算法详解

简介:面向机器视觉课程创新实践,这份手指手掌静脉识别Matlab工程聚焦手部静脉图像预处理算法实验研究。项目完整覆盖静脉识别链路,对手指和手掌分别进行轮廓分割、感兴趣区域(ROI)截取、静脉纹理增强与分割&#xff0c…

2026/9/12 8:15:09

制定项目章程全解析:启动过程组考点与10道真题拆解

很多备考信息系统项目管理师的同学,看到“启动过程组”就开始头疼:不就是一个立项流程吗,怎么还整出输入、工具与输出了?结果做题时各种翻车——商业文件被当成项目文件、项目章程以为是项目经理发布的、启动大会当成正式过程………

2026/9/12 8:15:08

分数阶模型与FOTF工具箱:从传递函数到分数阶PID整定实战

简介:专门处理分数阶系统建模与仿真的MATLAB微积分工具箱,面向科研人员、工程师及高校学生,解决分数阶微分方程求解、传递函数构建与数值积分等核心问题。压缩包共289个文件,总大小约2.32MB,含164个m脚本、53个mdl与37…

2026/9/12 8:10:08

GEO产业图谱解析与企业竞争力分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码