我的javascript模块中的函数未定义

我的javascript模块中的函数未定义,javascript,Javascript,我正在为浏览器编写JavaScript,我的script.js有如下内容 import { foo, bar } from "./lib/sth.js" function main() { ... } 然后,我的浏览器中有以下内容: <script type=module src="./script.js"></script> <body onload="main();"> ... </body> ... 但它总是给我这个错误: 未捕获引

我正在为浏览器编写JavaScript,我的script.js有如下内容

import { foo, bar } from "./lib/sth.js"
function main() { ... }
然后,我的浏览器中有以下内容:

<script type=module src="./script.js"></script>
<body onload="main();"> ... </body>

... 
但它总是给我这个错误:

未捕获引用错误:未定义main 加载时((索引):7)


为什么现在定义了我的主要目标?在我使用type=module之前,它工作得很好,但是对于import语句,我相信它必须是type=module

谢谢@HereticMonkey和@FelixKling

window.onload = function() { ... } 

对我的问题有效。但我不明白为什么import是这样设计的。假设我只想在我的脚本中使用一些库,然后导入它,为什么我的脚本也必须是一个模块?

如果我没有弄错的话,浏览器本机不支持导入。您是否使用任何编译器将es6代码编译成普通的旧js,以便浏览器能够理解它?我认为您的整个script.js没有正确加载,因为这一点。它不仅仅是main()函数。在这之前你还看到过其他错误吗?@alkismavridi肯定是的:它看起来不像script.js是moduleModule作用域!=全球范围。如果您希望
main
在全球范围内可用,您需要自己执行此操作:
window.main=main
@Royson:如果属性值仅包含特定的“安全”字符,则属性值周围的引号在HTML中是可选的。
为什么这使得我的脚本也必须是一个模块?
好吧,因为您编写了
@PatrickRoberts,但是如果我在不使用type=module的情况下使用import语句,则会在浏览器中导致语法错误是的,我知道,但是,
import
只能在模块范围内使用。这就是重点。这是我感到困惑的部分,如果我在C/C++中使用隐喻,我会说模块像“.h”,我的脚本只是一个普通的“.C”文件,如果我使用“.h”,那么我自己的文件也必须是“.h”。你的隐喻也没有意义。
.h
文件是声明,而
.c
是实现。在JavaScript中声明事物而不在同一范围内定义它们通常是不好的做法。这样做会导致类似于或的事情和问题以或的重复形式结束。