javascript的实际工作原理';s";“在飞行中”;汇编

javascript的实际工作原理';s";“在飞行中”;汇编,javascript,google-chrome,compiler-errors,compilation,interpreted-language,Javascript,Google Chrome,Compiler Errors,Compilation,Interpreted Language,我正在读Kyle的“你不知道JS”系列书/看他的讲座,他说,以下代码: var a = 2; 2(); 就Javascript语言而言,第二行是一个错误。它实际上在语法上是无效的。这不是运行时的问题;这是一个真实的授权问题 所以在解释语言中,如果我们纯粹是逐行运行,而不是进行多次传递,我们会先运行第一行,然后我们会发现第二行有问题,我们会抛出一个错误 但是一种编译语言,会说第二行有问题,它会在试图运行第一行之前用这个错误来标记您 因此,JavaScript在这方面更像是一种编译语言,而不是解释

我正在读Kyle的“你不知道JS”系列书/看他的讲座,他说,以下代码:

var a = 2;
2();
就Javascript语言而言,第二行是一个错误。它实际上在语法上是无效的。这不是运行时的问题;这是一个真实的授权问题

所以在解释语言中,如果我们纯粹是逐行运行,而不是进行多次传递,我们会先运行第一行,然后我们会发现第二行有问题,我们会抛出一个错误

但是一种编译语言,会说第二行有问题,它会在试图运行第一行之前用这个错误来标记您

因此,JavaScript在这方面更像是一种编译语言,而不是解释语言,因为JavaScript在尝试运行第一行之前肯定会先查看第二行。它看了看第一行以了解第一行是关于什么的,但它没有运行它。所以,当你把这样一个程序放在一个文件中,并将其加载到浏览器中时,第一行永远不会运行。您会立即收到一个错误,说第二行无效


所以我在chrome的控制台中尝试了这段代码,令人惊讶的是它工作得很好,我的意思是a变量将被分配,如果我们稍后尝试
console.log(a)
它将打印“2”

这是某种控制台的特定行为还是什么?

作者错了

首先:他的例子是无效的

2()
在Javascript中不是一个语法错误,这可能有点令人惊讶!它是完全有效的语法;这不是您可以做的事情,因此它在运行时会生成一个类型错误:

console.log(“test”);2() 测试 TypeError:2不是函数 这类错误不会阻止程序编译和运行。正如您在转录本中所看到的,只有在到达无效调用时才会抛出错误;在正常运行之前会抛出其他代码

比较引入真实语法错误时发生的情况:

控制台日志(“测试”);1x SyntaxError:意外的标识符 这实际上是一个语法错误--假定以
1
开头的“word”是一个数字,数字中不能包含
x
,因此它会阻止整个表达式的运行。
console.log()
永远不会执行


第二:作者在错误的地方划分了“解释”语言和“编译”语言

解析一个程序以找出它的含义,并捕获任何语法错误,与“编译”程序不同。这是编译过程中必要的第一步,但不是全部。实际上,“编译”“语言通常定义为输入程序在运行前转换为本机可执行文件的语言。在这方面,Javascript显然是一种解释语言


如果我们采用作者对“解释语言”的定义,即一个程序在一个过程中运行,甚至不解析文件的其余部分,那么这一类中几乎没有语言。(我唯一想到的是一些shell脚本语言。)

能否提供一个链接,指向您在哪里找到该示例?