Javascript változók kigyűjtése

Adott egy projekt, benne sok-sok .js fájl. Hogyan, milyen eszközzel lehetne kigyűjteni egy listába a fájlokban deklarált változókat? Arra lennék kíváncsi, hogy nincs-e valamelyik duplikáltan létrehozva.
(Nem vagyok webfejlesztő, a javascripthez sem igen értek:( Ugyan írtam egy Python scriptet, ami megpróbálja a feladatot elvégezni, de nem vagyok biztos abban, hogy mindent figyelembe vettem; és gondolom csak van erre valami kész eszköz.)

Hozzászólások

Ha stricre teszed a script futását, akkor kötelező a var szót használni.

https://www.w3schools.com/js/js_strict.asp

Minden .js fájl elejére be kell tenni.

Így biztosan "var"-ral kell deklarálni.
Biztosan figyeltél rá, de 'var ' vs. 'var' nem mindegy.

varangy+10;
var beka;

'var' esetében hibás találat is lesz.

http://www.redphoto.hu

"duplikáltan létrehozva": ez alatt azt érted, hogy létrehozásra kerül egy változó, majd utána egy másik részen újra használva lesz, de nem számolnak azzal, hogy már van értéke? erre az esetre a "var ..."-ra keresés nem biztos, hogy azokat az eseteket hozza ki, ami neked kell, mert lehet egy if két részében külön külön is létrehozva a változó, mégse lesz konfliktusuk.

Ha találtál megoldást dobd majd be ide, érdekes probléma.

Úgy tudom, hogy a különböző fájlokban létrehozott globális változók a böngészőben egy "name space"-be kerülnek. Ha a .js fájlokat különböző programozók készítették, és véletlenül azonos nevű változókat deklaráltak különböző célokra, akkor a fel nem ismert "váltott" használat problémát fog okozni.
--
eutlantis

Ha a "var" deklaracio nem egyertelmu, akkor lehet erdemes lenne az egyenloseg jelre keresni, es megnezni, hogy mi van a bal oldalon, majd tolni ra egy uniq-t. Igy nem csak azok a valtozok lesznek meg, amiket adott scope-ban deklaraltak, hanem azok is, amiket egy objektumon belul. Ld.


var myObject = {};
myObject.myProp = "whatev";

Végül ez lett, paradox módon Pythonban kigyűjtve a Javascript változókat:


#!/usr/bin/env python3
#-*- coding:utf-8 -*-

import os, os.path, sys, esprima

srcdir= sys.argv[1] if len(sys.argv)==2 else input("A bejárandó könyvtár neve:")

jsvars=set()

# Processing:
for curdir,subdirs,files in os.walk(srcdir):
    for fi in files:
        path=os.path.join(curdir,fi)
        if not path.endswith(".js"):
            continue
        with open(path) as ff:
            tokens= esprima.tokenize(ff.read())
        tokens=(esprima.toDict(tokens))
        #print(tokens)
        for d in tokens:
             if d["type"]=="Identifier":
                  jsvars.add( (d["value"],path) )
                    
jsvars=list(jsvars)

def getdup(ll):
    
    ll.sort()
    ldup=[]
    beg=(None,-1) # (variable_name, index_in_list)
    for index,(var,path) in enumerate(ll):
        if var != beg[0]:
            if beg[0] and index-beg[1]>1 :
                ldup.extend(ll[beg[1]:index])
            beg=(var,index)
            
    if beg[0] and index-beg[1]>1 :
        ldup.extend(ll[beg[1]:index])
    return ldup


for item in getdup(jsvars):
    print(item)  

---------
A kimenet ilyesmi(változó,fájl):
('ABCDE314', './subdir/test2.js')
('ABCDE314', './test1.js')
('abc', './subdir/test2.js')
('abc', './test1.js')
('vali100', './subdir/test2.js')
('vali100', './test1.js')
--
eutlantis