JavaScript代码如下:
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
document.write(b.xyz+this.cc);
</script>
上面只使用变量b(b={xyz:"123"};)
和cc(this.cc='bbb';)
。
有没有人知道是否有办法用Python或Lisp删除未使用的变量?
答案 0 :(得分:3)
尝试closure compiler
从javascript
代码中删除冗余代码和无用的空格:
我在158 bytes
上运行了您的代码(closure compiler
),我得到了这个代码(89 bytes
):
a={name:"abc"};b={b:"123"};this.a="bbb";d=new Date;document.write(b.b+this.a);
答案 1 :(得分:1)
在Common Lisp中,有parse-js来解析JavaScript代码。如果你想以交互方式评估JavaScript代码并执行某种动态分析,那么还有CL-JavaScript解释器,它构建在它之上。至于静态分析,还有cl-uglify-js,它也建立在parse-js之上 - 要么消除死代码,要么你可以尝试修改它来做...
答案 2 :(得分:1)
TXR中快速而脏的基于文本的黑客攻击:
script.txr:
@(collect)
@prolog
@(last)
<script>
@(end)
@(collect :vars (code))
@ (block occurs)
@ (cases)
@{decl /(var )?/}@{var /[a-z]+/}=@expr
@ (trailer)
@ (skip)
@ (cases)
@ (skip)@var@(skip)
@ (bind code `@decl@var=@expr`)
@ (or)
</script>
@ (fail occurs)
@ (end)
@ (or)
@code
@ (end)
@ (end)
@(last)
</script>
@(end)
@(collect)
@epilog
@(end)
@(output)
@{prolog "\n"}
<script>
@{code "\n"}
</script>
@{epilog "\n"}
@(end)
测试用例script.html
:
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
</script>
left
alone
执行命令
$ txr script.txr script.html
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
var e=new Array();
this.g=123;
this.g++;
</script>
left
alone
如你所见,实现了一些冷凝。
然而,代码认为aaa
构成变量a
的使用。保留变量e
,因为e
中出现var f=false
;但是你不再看到这一点,因为该行本身已被删除,因为f
没有发生。
如果你想要的不仅仅是基于文本的黑客攻击,你必须解析Javascript。 (在TXR中也可以采用清晰且有纪律的基于语法的方式,但编码所有语法规则是单调乏味的。)