0

История:Ловля все объявленные переменные в ESLint

В настоящее время я занимаюсь разработкой конкретного ESLint правила (link), чтобы поймать все места, где Eсть переменная, тени встроенный транспортир глобальная переменная, например browser или 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 
    } 
} 

Как вы можете видеть, я ищу для всех переменных и функций деклараций, функциональных выражений, улов положений и переключения заявления, охватывающее следующие случаи :

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) {} 

Вопрос:

У меня охватывал все места, где новый Varia Введенный в текущий объем? Есть ли более общий способ, чтобы получить объявленные переменные в любом месте кода, не догадываясь и явно определяя места их поиска?

+1

Не уверен, что это относится к вам, но вы можете проверить конструкторы функций создания строки, eval, setTimeout и setInterval. Даже не уверен, что это легко возможно с помощью eslint. – nils

ответ

1

Если вы поддерживаете ES6, то вам не хватает import объявлений. Однако есть несколько более простой способ сделать это. ESLint использует пакет под названием Escope под капотом, для отслеживания деклараций и использования переменных. Вы можете ознакомиться с правилом no-redeclare о том, как получить к нему доступ, и обратитесь к документации по Escope для получения информации об API. Escope должен позволить вам проверять все переменные в текущей области и видеть, если вы повторно объявляете переменную, которая уже существует.