【问题标题】:Catching all declared variables in ESLint在 ESLint 中捕获所有声明的变量
【发布时间】:2016-06-22 13:25:55
【问题描述】:

故事:

目前,我正在开发一个特定的 ESLint 规则 (link) 来捕获所有存在隐藏内置量角器全局变量的变量的地方,例如 @987654323 @ 或 element

现在的规则如下所示:

module.exports = function (context) {
  var protractorGlobals = [
    'browser',
    'protractor',
    'element',
    'by',
    '$',
    '$$'
  ]

  function checkVariables (node) {
    var variables = context.getDeclaredVariables(node)
    for (var i = 0; i < variables.length; ++i) {
      if (protractorGlobals.indexOf(variables[i].name) !== -1) {
        context.report(node, 'Unexpected Protractor built-in global variable shadowing')
      }
    }
  }

  return {
    'VariableDeclaration': checkVariables,
    'FunctionDeclaration': checkVariables,
    'FunctionExpression': checkVariables,
    'CatchClause': checkVariables
  }
}

如您所见,我正在寻找涵盖以下情况的所有变量和函数声明、函数表达式、catch 子句和 switch 语句:

var browser = "something";
function test (browser) {};
var browser;
function browser () {};
var browser = 1;
for (var browser = 0; by < 10; ++by) {}
try { json = JSON.parse(input) } catch (browser) {}

问题:

我是否涵盖了在当前范围内引入新变量的所有地方?是否有一种更通用的方式可以在代码中的任何位置获取声明的变量,而无需猜测并明确定义查找它们的位置?

【问题讨论】:

  • 不确定这是否与您相关,但您可能需要检查字符串函数创建函数构造函数、eval、setTimeout 和 setInterval。甚至不确定这是否可以通过 eslint 轻松实现。

标签: javascript node.js protractor eslint static-code-analysis


【解决方案1】:

如果您支持 ES6,那么您将缺少 import 声明。但是,有一种更简单的方法可以做到这一点。 ESLint 在后台使用名为 Escope 的包来跟踪变量的声明和使用。您可以查看no-redeclare 规则以了解如何访问它,并参阅Escope 文档以获取有关 API 的信息。 Escope 应该允许您检查当前范围内的所有变量,并查看您是否正在重新声明已经存在的变量。

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2011-06-29
    • 2016-12-27
    • 2020-08-31
    相关资源
    最近更新 更多