我试图了解 JS 是如何解析的。但我的搜索要么返回一些非常模糊记录的“解析器/生成器”项目(我什至不知道这意味着什么),要么返回如何使用神奇的“解析”方法使用 JS 引擎解析 JS。我不想扫描一堆代码并尝试一生去理解(虽然我可以,但这会花费太长时间)。
我想知道任意的 JS 代码字符串实际上是如何转换为对象、函数、变量等的。我还想知道将该字符串转换为内容、存储、引用、执行的过程和技术。
有这方面的任何文档/参考吗?
解析器可能以各种方式工作,但从根本上来说,它们首先经历标记化阶段,然后将结果提供给编译器,编译器如果可以的话将其转换为程序。例如,给定:
function foo(a) {
alert(a);
}
解析器将删除第一个字符(字母“f”)的所有前导空格。它将收集字符,直到它得到不属于的东西,即表示令牌结尾的空格。它再次从“foo”的“f”开始,直到到达“(”,所以它现在有了标记“function”和“foo”。它知道“(”本身就是一个标记,所以这是 3然后,它获取“a”,后跟“)”,这两个令牌组成 5,依此类推。
唯一需要空格的是在否则不明确的标记之间(例如,“function”和“foo”之间必须有空格或另一个标记)。
一旦标记化完成,它就会进入编译器,编译器将“function”视为标识符,并将其解释为关键字“function”。然后它得到“foo”,这是一个标识符,语言语法告诉它是函数名称。然后“(”表示一个开放分组运算符,因此表示形式参数列表的开始,依此类推。
编译器可能会一次处理一个令牌,或者可能会分块抓取它们,或者做各种奇怪的事情以使它们运行得更快。
您还可以阅读C/C++ 解析器如何工作?,这提供了更多线索。或者直接使用谷歌。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)