我正在读Kyle的《你不知道JS》系列丛书/看他的讲座,他说,下面的代码是:
var a = 2;
2();
就Javascript语言而言,第二行是一个错误。它实际上在语法上是无效的。这不是运行时的问题;这是一个实际的authortime问题。
因此,在解释语言中,如果我们纯粹是一行接一行地运行,而不是多次通过,我们会先运行第一行,然后我们会发现第二行有问题,我们会抛出错误。
但是,一种编译过的语言会说第二行有问题,它会在尝试运行第一行之前用这个错误来标记你。
"因此,在这方面,JavaScript更像是一种编译语言,而不是一种解释语言,因为JavaScript在尝试运行第一行之前,肯定会先查看第二行。它查看第一行是为了了解第一行的内容,但它没有运行它。因此,当你把这样的程序放在一个文件中,并将其加载到浏览器中时,第一行永远不会运行。您会立即得到一个错误,说第二行无效。">
所以我在chrome的控制台中尝试了这个代码,令人惊讶的是它运行得很好,我的意思是将分配一个变量,如果我们稍后尝试console.log(a)
,它将打印"2"。
这是某种控制台的特定行为还是什么?
作者错了。
第一:他的例子无效。
2()
不是Javascript中的语法错误,这可能有点令人惊讶!它是完全有效的语法;这不是你能做的事情,所以它在运行时会生成一个类型错误:
> console.log("test"); 2()
test
TypeError: 2 is not a function
这种错误不会阻止程序的编译和运行。正如您在记录中看到的,只有当到达无效调用时才会抛出错误;其他代码。
比较一下当我们引入一个真正的语法错误时会发生什么:
> console.log("test"); 1x
SyntaxError: Unexpected identifier
这实际上是一个语法错误——以1
开头的"单词"被认为是一个数字,数字中不能有x
——所以它阻止了整个表达式的运行。console.log()
从不执行。
第二:作者在错误的地方划分了"解释"one_answers"编译"语言之间的界限。
解析一个程序以了解它的含义,并捕捉任何语法错误,与"编译"它不同。这是编译的必要第一步,但并不是全部。事实上,"编译"语言通常被定义为输入程序在运行之前被转换为本机可执行文件的语言。在这方面,Javascript显然是一种解释语言。
如果我们采用作者对"解释语言"的定义,将程序一次性运行,甚至不解析文件的其余部分,那么几乎没有属于这一类的语言。(脑海中浮现的只有一些shell脚本语言。)