递归箭头函数中ESlint no-unused-vars误报问题咨询
自定义递归箭头函数触发ESlint no-unused-vars误报?
我实现了一个用于二分查找的自定义生成函数,代码如下:
const indexOf = (key) => (element, array, start, end) => { start = start || 0; end = end || array.length; const pivot = parseInt(start + (end - start) / 2, 10); if (array[pivot][key] === element[key]) return pivot; if (end - start <= 1) { return array[pivot][key] > element[key] ? pivot - 1 : pivot; } if (array[pivot][key] < element[key]) { return indexOf(key)(element, array, pivot, end); } return indexOf(key)(element, array, start, pivot); };
完成后ESlint针对最后一条return语句抛出“'indexOf'已赋值但未使用 no-unused-vars”警告。该函数为递归箭头函数,indexOf会在后续递归调用中被使用,我怀疑ESlint未正确解析条件结构导致误报,请问该推测是否正确,或是我存在疏漏?
结论
你的推测是正确的,这属于ESlint静态分析时的误报。
原因在于你定义的indexOf是高阶箭头函数,递归调用时需要通过indexOf(key)重新生成查找函数,但ESlint的解析器目前没能正确识别这种嵌套式的递归引用模式,误判indexOf变量未被使用。
代码逻辑验证
你的二分查找逻辑本身没有疏漏:递归分支的判断、边界处理、pivot计算都是合理的,indexOf确实会在递归过程中被调用,不存在未使用的情况。
解决办法
改用命名函数表达式(推荐)
用具名的内部函数替代箭头函数,让ESlint能明确识别递归引用:const indexOf = (key) => function search(element, array, start, end) { start = start || 0; end = end || array.length; const pivot = parseInt(start + (end - start) / 2, 10); if (array[pivot][key] === element[key]) return pivot; if (end - start <= 1) { return array[pivot][key] > element[key] ? pivot - 1 : pivot; } if (array[pivot][key] < element[key]) { return search(element, array, pivot, end); } return search(element, array, start, pivot); };临时忽略ESlint警告
在变量声明前添加注释,仅针对该变量关闭警告(不推荐长期使用):/* eslint-disable-next-line no-unused-vars */ const indexOf = (key) => (element, array, start, end) => { // ... 原有代码 };升级ESlint版本
部分较新的ESlint版本已经修复了这类嵌套递归箭头函数的识别问题,升级到最新稳定版可能解决该误报。
内容的提问来源于stack exchange,提问作者Chgad
相关产品推荐
相关产品推荐

