呵呵,我也写了一个容易出错的,效率应该还将就:<SCRIPT LANGUAGE="JavaScript"> <!-- function getParameterNames(functionObj){ reg=/var\s+([\w]+)/g var rs = functionObj.toString().match(reg); for (var i=0;i<rs.length;i++){ rs[i]=rs[i].replace(reg,"$1") } return rs; } function xx(){ var va1=0; var va2=0; var va3=0 } function test(){ var v="var i=0" } alert(getParameterNames(xx)); alert(getParameterNames(getParameterNames)); alert(getParameterNames(test));//这里出错 //--> </SCRIPT>
<!--
function getParameterNames(functionObj){
reg=/var\s+([\w]+)/g
var rs = functionObj.toString().match(reg);
for (var i=0;i<rs.length;i++){
rs[i]=rs[i].replace(reg,"$1")
}
return rs;
}
function xx(){
var va1=0;
var va2=0;
var va3=0
}
function test(){
var v="var i=0"
}
alert(getParameterNames(xx));
alert(getParameterNames(getParameterNames));
alert(getParameterNames(test));//这里出错
//-->
</SCRIPT>
这个小错是可以排除的:
当 functionObj.toString() 中无“eval(”时,将“"'”间的内容删去再做分析。
如何?
var v='var i=0' // 应该出来v
var v="asdf\";var i=\"0" //应该出来v
var v="asdf";var i="0"; //应该出来v和i
...
只是对
var v='var i=0' // 应该出来v
var v="asdf\";var i=\"0" //应该出来v
会多出 i 来
本来排除引号内的内容就可以了。因为正常的书写中,应该显式的声明变量。但是玩点花活,也有用eval来创建变量的。所以若没有eval时可以忽略引号中的内容,否则被eval处理的串中的定义也应算。
再复杂就是写语法分析了,好象又无此必要。
this.val1='a';
this.val2='b';
this.val3='c';
....
test(this);
}
function test(obj){
alert(obj.val1);
alert(obj.val2);
alert(obj.val3);
}
而且就算改掉名字了,也只能打出来变量的值。
而且就算打出来变量的名字了,也打不出来var 产生的内部变量。
为什么不试验了再帖出来?
try{eval("alert("+'a'+'"')}catch(X){}
但是一切所能做的只是通过字符串操作获得一个字符串罢了,字符串操作是最慢的。
var str="var str1='hello';"
你总不能认为str1也是一个变量吧