我不认为这是可行的,但是想把它扔给社区以证实我的怀疑。
假设您正在使用Python,PHP或ASP等其他语言编写程序。该程序旨在构建另一个用JavaScript编写的程序。但是,遗憾的是,第一个程序不能免于错误。因此,偶尔,构建JavaScript程序的程序会做一些时髦的事情,并在JavaScript源代码中输出语法错误。现在有些用户去加载程序并且它基本上停止了,因为运行它的Web浏览器无法正确解析JavaScript。这个用户可能不会高兴。我不会。
这让我想到了我的问题。是否有可能编写一个错误处理程序来捕获这些语法问题,从而允许应用程序正常失败?
以下是一个例子:
<html>
<head>
<script type="text/javascript" charset="utf-8">
window.onerror = errorHandler;
function errorHandler(a,b,c) {
alert('horray! No wait, Booo!');
}
vara jfs;
</script>
</head>
<body>
Can this be done?
</body>
</html>
或
<html>
<head>
<script type="text/javascript" charset="utf-8">
try {
vara jfs;
} catch (e) {
alert('horray! No wait, Booo!');
}
</script>
</head>
<body>
Can this be done?
</body>
</html>
答案 0 :(得分:2)
Google发布了他们的Closure toolset,其中包括JavaScript编译器和最小化程序。我没有亲自使用它,但听过很多很棒的东西。此外,它显然可以帮助您找到浏览器兼容性问题。
我认为它不会帮助您进行实时分析,但仍然可以成为一种有价值的工具。
答案 1 :(得分:2)
如果您对安全风险感到满意,可以在相关代码上调用eval()
来检测语法错误。
function say(x) { ... emit message in some way.... }
var scriptlets = [
"foof1 = function(a) {if (a == 7) { return \"A-OK\"; } } ",
"foof2 = function (a) {if argle bargle seventy 7, then this isn't going to work}"
];
function verifyScriptlet(n) {
var s = scriptlets[n];
try {
var x = eval(s);
say("verified #"+ n +", result: " + (typeof x));
}
catch (exc1)
{
say("Exception while verifying #"+ n +": " + exc1.message);
}
}
verifyScriptlet(0);
verifyScriptlet(1);
答案 2 :(得分:2)
通常,解析编程语言,如果成功可能编译成另一种形式,并且如果成功则在硬件或vm上解释/执行。仅仅因为代码通过一个阶段,并不意味着它是有效的代码。
您在询问代码是否在最后阶段运行,可以发现第一部分遇到的问题并进行处理。
有些语言为它自己的解析和编译机制提供了各种钩子。正如Cheeso所提到的,eval
是Javascript调用此机制的方式。
不是将所有脚本包装在字符串中,而是将它们保存在javascript文件中,并使用以下javascript(或类似)将它们加载到主程序中可能更好。
function load(file){
var client = new XMLHttpRequest();
client.open("GET", file, false);
client.send(null);
return client.responseText;
}
function include(file){
try {
eval(load(file));
} catch (e) {
alert("problem with file " + file);
}
}