JavaScript中不同语法错误的不同行为

时间:2018-08-10 13:43:46

标签: javascript syntax-error

我不是JavaScript程序员,所以这可能是一个非常基本的问题。问题是,当出现某些特定的语法错误时,整个JS代码将无法正常工作。

由于解释了JS,我认为它应该独立执行每一行,直到发生错误为止,但至少在以下情况下,它似乎没有发生:

console.log('a')
consol.log('b')    //intentional typo in "console"
console.log('c')

---- output ----
a
ReferenceError: consol is not defined

根据解释语言的工作方式,上述示例听起来很不错。现在看看以下错误:

console.log('a')
console.log('b'    //intentionally didn't put the right parenthesis 
console.log('c')

---- output ----
SyntaxError: missing ) after argument list

为什么不应该执行第一行?

我使用https://playcode.io来运行代码,并在Mozilla Firefox上完成了代码。

谢谢。

4 个答案:

答案 0 :(得分:3)

consol不是 语法 错误,而是运行时错误。

语法定义了语言,是什么使Javascript引擎理解了您想要它做什么。 console.log('b' console.log('c')无效的语法,因为Javascript引擎无法告诉您是否忘记了'b'console之间的某些运算符,或者这些运算符是单独的语句还是什么?你想要吗?

但是,consol.log()是一个完全有效的命令,假定某个名为consol的对象在运行时存在,在某个时间点可能会或可能不会行应该被执行。你只会发现然后。

Javascript始终解析并编译您提供的全部代码,以构建可运行的程序。这是发生语法错误的地方。只有当整个代码的语法正确时,它才会执行该代码,这可能会或可能不会产生运行时错误

  

由于解释了JS,我认为它应该独立执行每一行

“已解释”与此无关。拿这个:

while (foo) {
    bar();
}

很显然,它在这里不能独立执行每一行,因为这是一个复合构造。或这样:

foo();

function foo() {}

在执行function之前,必须先解析并悬挂此foo()。不,代码总是在运行时之前从上到下解析

答案 1 :(得分:0)

JavaScript分两个阶段进行评估。在第一阶段,解释器将整个代码转换为抽象语法树,并收集环境记录等中的所有变量。在那个阶段,发生早期错误,这意味着解析器无法理解您的代码。第二阶段是代码实际运行时,然后发生运行时错误。

答案 2 :(得分:0)

由于您未正确关闭括号,编译器是否有可能认为第三行仍是上面一行的参数?

例如

console.log('a')
console.log('b',
console.log('c'))

将是有效的代码。

答案 3 :(得分:0)

在第一个示例中,您可以定义一个函数consol.log()。您还没有,但是仍然可以将其解析为函数调用。

第二,浏览器无法解析它。封闭的(在语法上是错误的。

简而言之,它是在解析器中发现错误的abouts。

enter image description here