2012-09-13 43 views
0

在功能代码,当我这样做:为什么eval()代码中的语法错误被忽略?

eval('var default = 100;'); 
alert(default); 

浏览器的JS引擎*将抛出一个语法错误的声明,就好像第一个语句成功执行。

在这里看到:http://jsfiddle.net/4FMdy/打开浏览器的console查看错误日志

然而,当我从代码中删除第二条语句,让我只有这个:

eval('var default = 100;'); 

浏览器的JS引擎在该语句上抛出语法错误。

在这里看到:http://jsfiddle.net/4FMdy/1/

我不明白这一点。如果第一个语句抛出语法错误(因为它应该),为什么只有第二个语句在我上面的第一个示例中抛出这样的错误。据我所知,如果一个语句抛出一个错误,这必然意味着所有以前的语句(同一个调用)成功执行。

顺便说一句,语法错误引发是因为default是JavaScript中的保留字,所以它不能用作变量名。

此外,没有“eval是邪恶的”评论请。我只是想了解浏览器的JS引擎的行为。

*我在Firefox测试和Chrome

回答

2

只是一个假设:

脚本块首先将被解析,而不是执行过程中(EVAL)

浏览器只检测语法错误线#2,未执行完毕脚本块,所以他不会决定EVAL语法错误()

当你把2线在2个不同的脚本元素您会收到两个错误:

http://jsfiddle.net/doktormolle/CfRmj/

+0

是的,就是这样。现在我明白了。首先必须将令牌流解析为* Program *,然后才能评估生成的程序。 [第二段中的信息](http://es5.github.com/#x5.1.4)。根据语法语法,令牌'alert','(','default',')'和';'不是一个有效的序列。所以,这个程序是无效的,因此根本没有**评估。在传递给'eval()'的字符串中出现的任何语法错误只有在程序被评估时才能被检测到,这是根据语法语法分析后的*。 –

0

因为 “默认” 是的JavaScript保留关键字:)

所以警报(默认)抛出 “语法错误” 如果检查代码是否正确,但是然后函数eval运行,并且由于第一个错误而导致进程wount到达此处。