Skip to content

Instantly share code, notes, and snippets.

@Gaubee
Last active March 1, 2018 03:03
Show Gist options
  • Save Gaubee/5938254 to your computer and use it in GitHub Desktop.
Save Gaubee/5938254 to your computer and use it in GitHub Desktop.
获取一个函数体中出现的所有变量。
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