gpt4 book ai didi

javascript - ES6命名导入引入了const?

转载 作者:行者123 更新时间:2023-12-01 02:12:19 25 4
gpt4 key购买 nike

Transcrypt 的 ES6 模块之上实现 Python 模块机制Python 到 JavaScript 编译器,我面临以下问题:

有大量从 Python 运行时模块导入的标准函数,例如Python input 函数(在 JS 中实现),可以使用命名导入来使用(因为它们不必在用户代码中添加任何前缀,因此 input 而不是 __runtime__.input,以与 Python 保持一致)。

在 Python 中,允许重新绑定(bind)命名导入。因此,我定义了另一个函数 input,它将覆盖运行时中的函数。但如果我在 JS 中这样做,则会出现错误:

Identifier 'input' has already been declared

似乎所有导入的名称都被视为 JS const,因此根据 this article 不可重新绑定(bind)。我可以想到几个聪明的解决方法,例如在别名下导入,然后分配给模块全局 var 而不是 const,但喜欢保持简单,所以我的问题是:

  • 我说的对吗?JS 命名导入是 const,因此不可重新绑定(bind)(如果是这样,只是好奇,有人知道为什么)吗?我在哪里可以找到这方面的详细信息?
  • 有没有一种简单的方法来规避这个问题,并且仍然将它们放在导入模块的全局命名空间中,但可以随意覆盖它们?

最佳答案

per the language specification ,导入的绑定(bind)是不可变绑定(bind),因此无法更改。由于 ES6 模块的工作方式,标识符在模块解析时被保留:与 Python 不同,导入不是在执行时包含的语句;而是在执行时包含的语句。相反,模块的所有导入基本上都是在早期编译期间收集的,然后在模块开始执行之前解析。

这使得 ES6 模块有点不适合作为 Python 导入系统的实现。

作为一般方法,为了避免丢失这些名称,您可以简单地为导入的绑定(bind)指定不同的名称。例如,from foo import bar, baz 可以编译为以下内容:

import { bar as _foo__bar, baz as _foo__baz } from 'foo';
let bar = _foo__bar;
let baz = _foo__baz;

这只会保留一些特殊名称,同时保持 barbaz 标识符可变。

另一种可能也可以帮助您解决可能的导入语义差异的方法是简单地创建一个闭包:

import { bar, baz } from 'foo';

(function (bar, baz) {
// …

})(bar, baz);

或者甚至在两者之间添加一些其他查找机制。

<小时/>

顺便说一句。 Python 的 import 与 Node 的 require 非常相似,因此可能值得研究使 Node 的模块系统在浏览器中工作的所有解决方案。

关于javascript - ES6命名导入引入了const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49679340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com