CodeQL 文档

缺少变量声明

ID: js/missing-variable-declaration
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - maintainability
Query suites:
   - javascript-security-and-quality.qls

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

在 JavaScript 中,如果在函数中使用了一个变量但没有将其声明为局部变量,则默认情况下它会成为全局变量。这会导致意外后果:与局部变量不同,全局变量可以被所有函数读取和修改。如果不同的函数使用相同的全局变量,它们最终可能会覆盖彼此的值,从而导致难以察觉且难以诊断的错误。

建议

检查所讨论的变量是否应该为局部变量;如果是,请通过 var 声明将其声明。如果变量确实应该为全局变量,那么最好通过在源文件的开头插入全局 var 声明来记录这一事实。

示例

在以下示例中,fg 都使用循环计数器变量 i。由于它们都没有将 i 声明为局部变量,因此它们最终访问的是同一个全局变量,因此,每次 f 在循环中调用 g 时,g 都会覆盖 fi 的值。

function f(a) {
	var sum = 0;
	for (i=0; i<a.length; ++i)
		sum += g(a[i]);
	return sum;
}

function g(b) {
	var prod = 1;
	for (i=0; i<b.length; ++i)
		prod *= b[i];
	return prod;
}

应通过在 fg 中将 i 声明为局部变量来修复示例。

参考资料

  • D. Crockford,JavaScript:精粹,附录 A. O'Reilly,2008 年。

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