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”的意思。我从来没有想过用这种方式进行提升。谢谢