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