Javascript 要求和导入显示不同的行为。为什么会这样?
我同时使用了Javascript 要求和导入显示不同的行为。为什么会这样?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我同时使用了require和import,但从这两个方面得到了一些不同的行为。到目前为止,我一直假设require和import只是ES5和ES6。我在做以下工作: abc.js console.log("abc"); console.log("xyz"); require("./abc"); import "./xyz"; import "./xyz"; require("./abc"); xyz.js console.log("abc"); console.log("xyz");
require
和import
,但从这两个方面得到了一些不同的行为。到目前为止,我一直假设require
和import
只是ES5和ES6。我在做以下工作:
abc.js
console.log("abc");
console.log("xyz");
require("./abc");
import "./xyz";
import "./xyz";
require("./abc");
xyz.js
console.log("abc");
console.log("xyz");
require("./abc");
import "./xyz";
import "./xyz";
require("./abc");
hello.js
console.log("abc");
console.log("xyz");
require("./abc");
import "./xyz";
import "./xyz";
require("./abc");
第二次,我更改了文件并交换了两行
hello.js
console.log("abc");
console.log("xyz");
require("./abc");
import "./xyz";
import "./xyz";
require("./abc");
这两次它都给出了相同的输出
xyz
abc
即,require
的输出总是在导入之后。如果我只使用import,或者只使用import
,它会像预期的那样,一个接一个地提供控制台。
有人能帮助理解这一点吗?在运行
hello.js
中的任何代码之前,通过import
导入在hello.js
中声明的模块。import
语句是否出现在另一个语句之后并不重要。在代码运行之前,模块仍处于加载状态。因此,无论将import
语句放在何处,都会首先得到“xyz”
另一方面,
require()
是编程的。当程序运行时遇到require()
语句时,就会运行模块代码。由于node.js中尚未实现(不确定)ES6模块,我假设您正在使用babel传输导出、导入
语句
当babel传输代码时,它总是将导入语句放在模块的顶部,因此会发生这种情况。您可以在中进行测试
相当确定的是,
import
语句被挂起,这会导致这种行为,但我没有消息来源确认答案。我不知道为什么人们只按任何按钮而不发表任何评论-1.为什么@ZZZBOV提升?????有趣的是,提升的功能将如何改变任何东西?您确定解释器在运行require语句之前不只是处理import语句吗?我认为这是一个合理的问题。@shanimal首先处理导入语句是“highed”的意思。我从来没有想过用这种方式进行提升。谢谢