我不是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上完成了代码。
谢谢。
答案 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)