首页 > 解决方案 > JavaScript 中不同语法错误的不同行为

问题描述

我不是 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 上完成。

标签: javascriptsyntax-error

解决方案


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

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

但是,consol.log()这是一个完全有效的命令,假设在运行时存在一些名为的对象consol,在应该执行该行的时间点可能会或可能不会出现这种情况。只有到那时你才会发现。

Javascript 总是解析和编译你给它的整个代码来构建一个可运行的程序。这是发生语法错误的地方。只有当整个代码的语法正确时,它才会执行该代码,这可能会或可能不会产生运行时错误

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

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

while (foo) {
    bar();
}

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

foo();

function foo() {}

function需要在执行之前进行解析和提升foo()不,代码总是在 runtime 之前从上到下解析。


推荐阅读