javascript - JS const 变量如何编译成浏览器友好的代码,使它们是只读的?
问题描述
我有以下变量:
const x = ['item']
然后我尝试使用 Babel 的实时编译器,它给了我以下编译代码:
"use strict";
var x = ["item"];
现在,当我尝试将其他东西 ( x = {}
) 分配给变量x
时,它会抛出错误。我在任何地方都看不到我不能x
在编译的代码中进行更改!一般来说,var
是可编辑的吗?
谁能帮我理解这一点?
解决方案
如果我尝试 babel 输出,我可以为 x 分配一个新值,它就可以工作。原因是输出的代码是 ECMAScript 5,并且没有 const 的概念。您可以通过在 MDN 上的“JavaScript Demo: Statement - Const”示例中将 const 更改为 var 来尝试一下。
因此,babel 会将其编译(或“转换”)为可分配变量,因为没有其他方法。但在执行此操作的过程中,它会验证您的原始代码以查看您是否没有对 x 进行赋值,如果这样做则会引发错误。
Babel 会检查你是否在编译过程中将其用作常量,但在最终代码中,不再强制 x 为常量,因此您可以通过修改输出的代码轻松打破这一点。
为了比较,任何编译器都是如此。如果您使用十六进制编辑器并修改可执行文件,您还可以破坏编译器在生成可执行文件时所做的任何事情。事实上,如果您在程序完成后对其进行修改,那么对于每个程序的输出都是如此(想想图像、文档……)
推荐阅读
- api - 如何在 API Manager (apim) 中对 JWT 进行错误处理
- c# - 无法删除“Program Files\my app”文件夹中的文件:System.UnauthorizedAccessException:拒绝访问路径“”
- spring - 如何记录空通道
- java - 具有名称和数字的列表的最快搜索算法是什么
- sql - SQL 中的日期格式
- swift - Swift:如果由第三方安装,FCM 推送通知不起作用(未注册错误)
- django - Django ModelForm:加载表单时巨大的 ForeignKey 查询集导致崩溃
- amazon-athena - 在 AWS Athena 中使用混合格式的 parquet 和 JSON
- vb.net - vb.net 检查所有行是否包含值
- json - 如何使用带有连接查询结果的模型映射外键引用数据?