javascript - 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 上完成。
解决方案
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 之前从上到下解析。
推荐阅读
- java - playframework 2.8.8 - 类 sbt.internal.inc.MappedVirtualFile 不能转换为类 java.io.File
- laravel - Laravel Eloquent:关系 - hasOneThrough
- python - 我想将电子邮件字段用作用户、供应商的主要字段。但是对于 django-admin 我想通常使用用户名字段。需要建议
- gitlab - Gitlab自管静态页面未加载
- angular - 使用 Angular 和 Spring Boot 项目实现 csrf
- c - 在 Windows 上绘制客户区时“清除更新区域”是什么意思?
- leaflet - 使用 Leaflet Js 缩放到 WMS 图层的选定多边形
- autodesk-forge - 如何找到 Revit 项目基点的位置
- c# - 必须在 C# 代码中实现代数方程
- javascript - ChartJS Annotations 显示自定义标签