缺少导出限定符¶
ID: js/node/missing-exports-qualifier
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- maintainability
- frameworks/node.js
Query suites:
- javascript-security-and-quality.qls
在导出相同名称的定义的模块中引用一个未声明的全局变量会导致混淆,并且可能表示错误。
建议¶
如果全局变量引用是故意的,请考虑添加 JSLint /*global ...*/
指令或 externs 声明来声明该变量。
如果全局变量引用是无意的,用 exports
限定引用将使其引用导出的定义。
示例¶
在下面的示例中,模块导出两个函数 checkOne
和 checkList
。后者也被存储在模块本地的同名变量中,但前者没有。因此,第 7 行上的调用 checkOne(xs[i])
不引用第 1 行定义的函数,而是引用一个未声明的全局变量,其名称也是 checkOne
。
exports.checkOne = function(x) {
if (!x) throw new Error();
};
var checkList = exports.checkList = function(xs) {
for (var i=0; i<xs.length; ++i)
checkOne(xs[i]);
};
假设意图是调用第 1 行定义的 checkOne
函数,则该调用应使用 exports
限定,如下所示
exports.checkOne = function(x) {
if (!x) throw new Error();
};
var checkList = exports.checkList = function(xs) {
for (var i=0; i<xs.length; ++i)
exports.checkOne(xs[i]);
};
参考文献¶
Node.js: 模块.
JSLint 帮助: JSLint 指令.
Closure Compiler: 高级编译和 Externs.