【问题标题】:How actually works javascript's "on the fly" compilation?javascript的“即时”编译实际上是如何工作的?
【发布时间】:2017-01-14 18:19:05
【问题描述】:

我正在阅读 Kyle 的“你不懂 JS”系列丛书/观看他的讲座,他说,对于以下代码:

var a = 2;
2();

就Javascript语言而言,第二行是错误的。它实际上在语法上无效。这不是运行时问题;这是一个实际的作者时间问题。

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

但是编译语言会说第二行的问题,它会在尝试运行第一行之前用该错误标记您。

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


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

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

【问题讨论】:

  • 你能提供一个链接到你找到那个例子的地方吗?

标签: javascript google-chrome compiler-errors compilation interpreted-language


【解决方案1】:

作者错了。

第一:他的例子是无效的。

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

> console.log("test"); 2()
test
TypeError: 2 is not a function

这种错误不会阻止程序被编译和运行。正如您在成绩单中看到的那样,只有在到达无效调用时才会抛出错误;正常运行前的其他代码。

比较当我们引入真正的语法错误时会发生什么:

> console.log("test"); 1x
SyntaxError: Unexpected identifier

这实际上是一个语法错误——以1 开头的“单词”被假定为一个数字,而数字中不能包含x——因此它会阻止整个表达式运行。 console.log() 永远不会被执行。


第二:作者在错误的地方划定了“解释”和“编译”语言之间的界限。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    相关资源
    最近更新 更多