缺少变量声明¶
ID: js/missing-variable-declaration
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- reliability
- maintainability
Query suites:
- javascript-security-and-quality.qls
在 JavaScript 中,如果在函数中使用了一个变量但没有将其声明为局部变量,则默认情况下它会成为全局变量。这会导致意外后果:与局部变量不同,全局变量可以被所有函数读取和修改。如果不同的函数使用相同的全局变量,它们最终可能会覆盖彼此的值,从而导致难以察觉且难以诊断的错误。
建议¶
检查所讨论的变量是否应该为局部变量;如果是,请通过 var
声明将其声明。如果变量确实应该为全局变量,那么最好通过在源文件的开头插入全局 var
声明来记录这一事实。
示例¶
在以下示例中,f
和 g
都使用循环计数器变量 i
。由于它们都没有将 i
声明为局部变量,因此它们最终访问的是同一个全局变量,因此,每次 f
在循环中调用 g
时,g
都会覆盖 f
对 i
的值。
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;
}
应通过在 f
和 g
中将 i
声明为局部变量来修复示例。
参考资料¶
D. Crockford,JavaScript:精粹,附录 A. O'Reilly,2008 年。