CodeQL 文档

冲突的函数声明

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

点击查看 CodeQL 代码库中的查询

如果在同一个作用域中声明了两个同名函数,其中一个声明会覆盖另一个声明,而不会发出警告。这会使代码难以阅读和维护。在某些情况下,哪个声明覆盖哪个可能会取决于平台。

建议

如果两个声明是重复的,请删除其中一个。否则,请重命名其中一个函数以区分这两个函数,或者将函数声明转换为将函数表达式分配给同一个局部变量。

示例

在下面的示例中,函数converterif语句的两个分支中定义不同。但是,出现在程序文本中较后的函数定义将覆盖较早出现的函数定义,与通过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.

  • ©GitHub, Inc.
  • 条款
  • 隐私