2016-03-03 2 views
0

Предположим, у меня есть доступ к полному набору источников, которые потенциально могут использовать переменную JavaScript foo.Как переход переходного использования переменной JavaScript через вызовы функций?

Некоторые из исходного кода выглядит следующим образом:

foo.bar = 'baz'; 

(function(a, b, c) { 
    a(); 
    b.bar = 'whee'; 
    c(); 
}(fn, foo, fn)); 

Есть ли какие-либо инструменты, доступные (правила ESLint, модули НПХ и т.д.), которые могли бы идентифицировать все вхождения в foo переменных здесь? Я получаю список всех доступных переменных, в том числе в пределах областей и включая вложенные объекты. Таким образом, он должен определить:

  • foo.bar использования в глобальном масштабе
  • foo использования в вызове функции
  • b.bar вызова является доступ foo.bar
+0

И что t об строках eval'd, которые ссылаются на переменную? –

+0

'b.bar' не использует переменную' foo'. – Bergi

+0

Вы можете отследить все ссылки (не -eval) на идентификатор 'foo' (а также вне зависимости от того, входит ли он в зону вызова' eval'), но вы не можете отслеживать все обращения к определенному объекту без выполнения кода (что сводится к проблеме остановки) – Bergi

ответ

1

http://ternjs.net/doc/manual.html#infer кажется как хороший провод:

infer.findRefs(ast: AST, scope: Scope, name: string, refScope: Scope, f: fn(AST, Scope)) 
Will traverse the given syntax tree, using scope as the starting scope, looking for references to variable name that resolve to scope refScope, and call f with the node of the reference and its local scope for each of them. 

infer.findPropRefs(ast: AST, scope: Scope, objType: Obj, propName: string, f: fn(AST)) 
Analogous to findRefs, but used to look for references to a specific property instead. Whereas findRefs is precise, this is dependent on type inference, and thus can not be relied on to be precise. 
Смежные вопросы