Last active
March 1, 2018 03:03
-
-
Save Gaubee/5938254 to your computer and use it in GitHub Desktop.
获取一个函数体中出现的所有变量。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var KEYWORDS = "abstract,boolean,byte,char,double,final,float,goto,implements,int,interface,long,native,package,private,protected,public,short,static,synchronized,throws,transient,volatile,arguments,let,yield"; | |
var NO_VAR_KEYWORDS={}; | |
var REMOVE_RE = /\/\*(?:.|\n)*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|'[^']*'|"[^"]*"|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g; | |
var SPLIT_RE = /[^\w$]+/g; | |
var KEYWORDS_RE = new RegExp(["\\b" + KEYWORDS.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g'); | |
var NUMBER_RE = /\b\d[^,]*/g; | |
var BOUNDARY_RE = /^,+|,+$/g; | |
var getVariables = function(code) { | |
code = code | |
.replace(REMOVE_RE, '') | |
.replace(SPLIT_RE, ',') | |
.replace(KEYWORDS_RE, '') | |
.replace(NUMBER_RE, '') | |
.replace(BOUNDARY_RE, ''); | |
code = code ? code.split(/,+/) : []; | |
for(var i = 1,Len = code.length,filterCodeArray = [],filterCodeHash = {},arg;i<Len;i+=1){//过滤关键字与重复出现的变量 | |
arg = code[i]; | |
if (!filterCodeHash[arg]&&!NO_VAR_KEYWORDS[arg]) { | |
try{ | |
(function(k){eval("var "+k);}(arg)); | |
}catch(e){ | |
NO_VAR_KEYWORDS[arg] = 1; | |
continue; | |
} | |
filterCodeArray.push(arg); | |
filterCodeHash[arg] = 1; | |
} | |
} | |
return filterCodeArray; | |
}; | |
//*********Test************** | |
function test(){ | |
try { | |
var a = 1; | |
a = b; | |
if (x) { | |
a = c; | |
}; | |
c = arguments; | |
for(i = 0;i<Len;i+=1){ | |
b[i] = i; | |
} | |
return a+b||c; | |
}catch(e){}; | |
} | |
console.log(getVariables(test.toString())); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment