【问题标题】:Why is the syntax error in the eval() code ignored?为什么忽略 eval() 代码中的语法错误?
【发布时间】:2012-09-13 13:21:36
【问题描述】:

在功能代码中,当我这样做时:

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

浏览器的 JS 引擎* 将在 second 语句上抛出语法错误,就好像第一条语句成功执行一样。

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

但是,当我从代码中删除第二条语句时,我只有这个:

eval( 'var default = 100;' );

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

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

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

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

另外,请不要“评估是邪恶的”。我只是想了解浏览器的 JS 引擎的行为。

* 我在 Firefox 和 Chrome 中测试过

【问题讨论】:

    标签: javascript browser theory interpreter


    【解决方案1】:

    只是一个假设:

    脚本块首先会被解析,但不会被执行(eval)

    浏览器只检测到第2行的语法错误,并没有执行完整的脚本块,所以他不会确定eval()中的语法错误

    当您将 2 行放在 2 个不同的脚本元素中时,您将收到两个错误:

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

    【讨论】:

    • 是的,就是这样。现在我明白了。令牌流首先必须被解析成一个Program,然后才会评估结果程序。 Info in second paragraph here。根据句法语法,标记alert、(、default、) 和; 不是有效序列。因此,该程序无效,因此根本不评估。传递给eval() 的字符串中出现的任何语法错误只有在程序被评估后才能被检测到,即在根据语法语法对其进行解析之后。
    【解决方案2】:

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

    因此,如果检查代码是否正确,则 alert(default) 会引发“语法错误”,但随后会运行 eval 函数,并且由于第一个错误,进程将不会到达这里。

    【讨论】:

      猜你喜欢
      • 2015-01-11
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多