CodeQL 文档

缺少导出限定符

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

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

在导出相同名称的定义的模块中引用一个未声明的全局变量会导致混淆,并且可能表示错误。

建议

如果全局变量引用是故意的,请考虑添加 JSLint /*global ...*/ 指令或 externs 声明来声明该变量。

如果全局变量引用是无意的,用 exports 限定引用将使其引用导出的定义。

示例

在下面的示例中,模块导出两个函数 checkOnecheckList。后者也被存储在模块本地的同名变量中,但前者没有。因此,第 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]);
};

参考文献

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