JavaScript 解析器如何工作?

2023-11-29

我试图了解 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(使用前将#替换为@)

JavaScript 解析器如何工作? 的相关文章

随机推荐

  • 在 AJAX 加载的页面中使用 fancybox

    我在这个组中搜索并四处搜索 但仍然没有找到答案 我还看到有些人有我的问题 但线程没有帮助 所以我在这里 这个问题很简单 为了帮助你 我打包了一个 zip 其中包含 您可以测试的文件 http www ivanhalen com fancyp
  • 使用 Linq to Entities 插入现有行的副本 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在使用实体框架 我有一个带有自动生成的主键的表以及与其他主数据表的许多外键关系 我们需要一个复制功能 其中我们可以从表中选择任何现有行并将其作为副本插入到同一个表中 我需要复制所
  • 来自 Makefile 子目录的源代码

    我有一个使用 Makefile 构建的 C 库 直到最近 所有源代码都在一个目录中 并且 Makefile 做了类似的事情 SOURCES wildcard cpp 效果很好 现在我添加了一些位于子目录中的源 例如subdir 我知道我能做
  • 使用 dplyr 更改第一行 group_by 主题 ID 的变量值

    超过 2 000 个科目 我想按主题将每个第一行的 time2 值更改为 0 例如 ID 2 主题的第一行的 time2 为 1 考虑到 2k 科目 如何将其更改为 0 ID time1 time2 1 0 0 1 0 1 1 1 5 2
  • 如何通过单击取消选中单选按钮?

    与复选框不同 单选按钮一旦被单击 用户就无法取消选择 有什么方法可以使用 Javascript 以编程方式切换它们吗 最好不使用 jQuery 您可以设置 HTML 对象的属性checked to false像这样 document get
  • 如何在构建时始终运行命令而不考虑任何依赖项?

    我想运行一个解析整个源代码树的 cmake 命令 因此我无法列出 cmake 的 add custom command add custom target 命令中所有可能的依赖项 是否可以告诉 cmake 不带任何条件地运行命令 我尝试了在
  • 运动事件问题

    我想知道如何获得 MotionEvent 的准确 get x 和 get y 值 发生的情况是 当我触摸屏幕上的特定区域时 我会告诉要发生一个动作 问题是 一旦我触摸屏幕并将手指移开 它仍然认为我的手指位于同一位置 因为这是我最后触摸的位置
  • 如何在网格布局中显示二维数组

    I have Array myArray new Array 5 5 or Array myArray new Array 7 9 or new Array 12 13 我想将数组显示在GridLayout 我找到了很多例子 但没有二维数组
  • 适用于 MVC 5 模型的 Typeahead.js

    我刚刚使用 MVC 5 模型包装器的 Typeahead js 实现了 typeahead 功能 http timdwilson github io typeahead mvc model 一切正常 但我只是不知道如何设置建议下拉列表中显示
  • 处理 Chrome 中的“Enter”/“Return”键

    我有一个 AJAX y 类型的页面 当用户单击 GO 时 我需要执行特定的 JavaScript 函数 我还想在用户点击 Enter 或 Return 时模拟 GO 点击 请注意 我不想 提交 页面 原因是因为我是通过 JavaScript
  • 如何更改 Nimbus 中单个 JProgressBar 的颜色?

    我正在尝试更改 Nimbus LAF 外观和感觉 中单个 JProgressBar 的颜色 这个解决方案确实有效 但它改变了所有 JProgressBars 的颜色 UIDefaults defaults UIManager getLook
  • 更改窗口内容时的资源管理

    首先 我觉得自己并没有完全了解如何在窗口的多个 页面 之间导航 例如 我有一个名为 MainWindow 的窗口 在其中 我有一个页眉和一个页脚 中间是一个包含内容的面板 该面板最初包含内容 A 单击 A 中的某些内容后 我想从视图中删除
  • 具有扩展接口的派生类的集合。如何在没有动态转换的情况下访问派生接口?

    假设我有一个 动物 类型的抽象对象 动物有公纯虚法 吃 我想将 Animal 派生为 狗 和 猫 每个都有一个扩展接口 例如 我希望 Dog 有一个公共方法 chases Tail 而 Cat 有一个公共方法 destroy Furnitu
  • 如何启用嵌入式 tomcat 日志记录

    我在我的java应用程序中使用嵌入式tomcat 下面是我的源代码 但是 tomcat 没有生成任何日志 embedded new Embedded embedded setDebug 3 org apache catalina logge
  • 使用 Java 的 AES-256-GCM 解密中的标签不匹配错误

    我用 Javascript 编写了以下函数 用于使用 aes 256 gcm 进行加密 encrypt function text masterkey try random initialization vector var iv cryp
  • 在 inno setup 中运行 InstallUtil {app}/file.exe

    我想将服务文件复制到 app 目录 然后将其用作 InstallUtil exe 中的参数 这是我的代码的一部分 Files Source WCFService exe DestDir app Source WCFService exe c
  • Maven:“由以下原因引起:java.lang.NoClassDefFoundError:com/omnesys/omne/om/OMN”

    我想将第 3 方外部 jar 添加到我的 Maven 存储库中 我的项目是Spring Boot Error Exception in thread main java lang reflect InvocationTargetExcept
  • 如何在 Three.js 中等待纹理从 JSON 模型加载完成?

    我有一个基于 AlteredQualia 的皮肤示例成功加载的 JSON 模型 但是 我不想在模型加载完成之前透露该模型 正如您在此示例中所看到的 模型首先出现 然后加载它们的纹理资源 http alteredqualia com Thre
  • JSON.net 循环遍历 facebook json 数组

    嘿 我想弄清楚如何循环遍历如下所示的 JSON 数组 data id 1zzz87 1020zzzzzzz9403 from id 10zzzzzz487 name Tom zzzzz story Tom zzzz shared YouVe
  • JavaScript 解析器如何工作?

    我试图了解 JS 是如何解析的 但我的搜索要么返回一些非常模糊记录的 解析器 生成器 项目 我什至不知道这意味着什么 要么返回如何使用神奇的 解析 方法使用 JS 引擎解析 JS 我不想扫描一堆代码并尝试一生去理解 虽然我可以 但这会花费太