javascript - javascript 的 "on the fly"编译实际上是如何工作的?

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

我正在阅读凯尔的“你不知道 JS”系列书籍/观看他的讲座,他说,对于以下代码:

var a = 2;
2();

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

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

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

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

<小时/>

所以我在 Chrome 的控制台中尝试了这段代码,令人惊讶的是它工作得很好,我的意思是 a 变量将被分配,如果我们稍后尝试 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() 永远不会执行。

<小时/>

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

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

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

关于javascript - javascript 的 "on the fly"编译实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653383/

相关文章:

javascript - 使用 vba 和 InternetExplorer.Application 重新计算 jquery 表单的火灾事件

google-chrome - 我如何使用 chrome 扩展内容脚本在启动时将 html 注入(inject)到页面中

javascript - 在 Chrome 中的用户脚本之间传输信息

google-chrome - 为什么 "-webkit-transform-style: preserve-3d;"会让一些div消失?

javascript - 切换字符串中的数字

javascript - 如何使用 javascript 自动播放 html5 音频标签

android - 编译android 4.0.3时找不到-ltinfo

windows - Cmake 找不到 wxWigets

javascript - 在 Selenium 中使用 JavaScriptExecutor 和 Java - 它获取值但不将其显示在字段中

c - 错误: 'for' loop declarations only in c99 mode