Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么ES6从一个模块导入所有函数,而不仅仅是请求的函数?_Javascript_Es6 Modules - Fatal编程技术网

Javascript 为什么ES6从一个模块导入所有函数,而不仅仅是请求的函数?

Javascript 为什么ES6从一个模块导入所有函数,而不仅仅是请求的函数?,javascript,es6-modules,Javascript,Es6 Modules,从模块导入函数时,将导入所有导出的函数,尽管main.js中只导入了一个: someModule.js: export let print_a = (function(){ console.log('Hello from a') })(); export let print_b = (function(){ console.log('Hello from b') })(); main.js: import { print_a } from './someModule.js'

从模块导入函数时,将导入所有导出的函数,尽管main.js中只导入了一个:

someModule.js:

export let print_a = (function(){
    console.log('Hello from a')
})();

export let print_b = (function(){
    console.log('Hello from b')
})();
main.js:

import { print_a  } from './someModule.js';
index.html:

...
<body>
<script type="module" src="main.js"></script>
</body>
</html>
。。。
因为我只从someModule.js导入了print_a,所以我希望得到输出:

“你好,a”

相反,我得到了输出:

“你好,a”

“你好,b”


为什么在main.js中没有导入print_b时调用它?

这两个都是立即调用的函数表达式。您已执行一个IIFE并将其值分配给
print\u b
,但尚未导入
print\u b
。您可以通过尝试执行
console.log(print_b)

来测试这一点,chucksmash说的是真的。这些是iife。您是否考虑过使用函数声明,然后使用“require”语法进行导出,如下所示:

module.exports = function print_a(){
  console.log('Hello from a')
});


module.exports = function print_b(){
   console.log('Hello from b')
});
或者,您可以定义函数,然后在一条语句中显式导出它们(而不是单独将每个函数分配给module.exports):

我将使用require语法来导入模块 进入将调用以下函数的JS文件:

const { printA, printB } = require('./someModule.js')

require和import之间的主要区别在于require将自动扫描node_模块以查找模块,而来自ES6的import则不会。大多数人使用babel来编译导入和导出,这使得导入与require

Javascript需要评估
someModule.js
以了解其中的内容。您正在调用该文件中的函数,但会产生副作用。所以你会看到这些副作用。如果不希望在读取文件时计算这些函数,请删除
()
,并在导入后调用它们。实际上,您正在将
print_a
的值设置为
undefined
,因为这是函数调用返回的值。因为这是规范所说的在浏览器中处理JavaScript MIME类型的方式。检索文件并立即解析(整个文件)。正如马克所说,如果你不想产生副作用,就相应地构建你的模块。-“moduleItemList”是设置导入、导出语句和模块主体。我认为OPs的要点是读取和执行整个模块文件。这是真的。当谈到术语“导入”时,OP的术语有点多余:
const { printA, printB } = require('./someModule.js')