我正在对解释与编译进行一些研究。成立本文 https://almogad.medium.com/javascript-is-it-compiled-or-interpreted-9779278468fc其中指出...
console.log("Hello World");
oops oops;
这段代码不会输出Hello World
因为 JS 是编译过的并且因为oops oops;
JS 编译器肯定会抛出错误。SyntaxError: Unexpected identifier
但如果我删除第二个oops
i.e.
console.log("Hello World");
oops;
此代码仍然会引发错误,尽管是不同的错误ReferenceError: oops is not defined
,但它首先写Hello World
到控制台。
我理解这两个错误。所以,当有一个语法错误,编译过程停止,因为它无法处理错误的语法,并且无法根据我的理解生成 AST(抽象语法树)。因此,没有字节码。但当它是一个参考错误,怎么编译呢?
抱歉,如果我在错误的交易所问这个问题。如果是这样,请告诉我应该在哪个论坛上提出这个问题。
另外,我知道这是意外的行为,我不应该问为什么损坏的代码会这样工作。我只是好奇。
第一步是标记化/扫描/词法分析:
console.log("Hello World");
oops oops;
被“分裂”成
console . log ( "Hello World" ) ; oops oops ;
然后是解析器(它将令牌流验证/解析为树)。
它将其视为一个语句(函数调用):
console . log ( "Hello World" ) ;
然后它看到这个:
oops oops;
这是无效的语法,因此您有语法错误。
在你的第二个例子中,这只是:
oops;
这是有效的语法。
接下来,在创建某种树之后,有 JIT 和一堆其他步骤,但我们只对执行感兴趣。
它执行 console.log 非常好,但随后它发现有一个未定义的标识符。因此出现参考错误。
总而言之,JavaScript 是被解释的(也是即时编译的),并且因为它是被解释的,所以它“逐行”解释你的代码。它解释并执行console.log,然后尝试解释并执行oops;
,这会导致错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)