冲突的函数声明¶
ID: js/function-declaration-conflict
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- reliability
- correctness
- external/cwe/cwe-563
Query suites:
- javascript-security-and-quality.qls
如果在同一个作用域中声明了两个同名函数,其中一个声明会覆盖另一个声明,而不会发出警告。这会使代码难以阅读和维护。在某些情况下,哪个声明覆盖哪个可能会取决于平台。
建议¶
如果两个声明是重复的,请删除其中一个。否则,请重命名其中一个函数以区分这两个函数,或者将函数声明转换为将函数表达式分配给同一个局部变量。
示例¶
在下面的示例中,函数converter
在if
语句的两个分支中定义不同。但是,出现在程序文本中较后的函数定义将覆盖较早出现的函数定义,与通过if
语句的执行流程无关,因此在本例中始终返回第二个函数。(请注意,这在较旧的浏览器中可能不适用)。
function getConverter(dir) {
if (dir === 'c2f') {
function converter(c) {
return c * 9/5 + 32;
}
} else {
function converter(f) {
return (f - 32) * 5/9;
}
}
return converter;
}
要解决此问题,请引入一个局部变量converter
,并将函数声明转换为将函数表达式分配给此变量。
function getConverter(dir) {
var converter;
if (dir === 'c2f') {
converter = function (c) {
return c * 9/5 + 32;
};
} else {
converter = function (f) {
return (f - 32) * 5/9;
};
}
return converter;
}
参考资料¶
Ecma International,《ECMAScript 语言定义》,5.1 版,第 10.5 节。ECMA,2011。
通用弱点枚举:CWE-563.