直接在HTML中使用ES6模块中定义的函数

Ale*_*aro 7 html javascript es6-modules

我正在尝试完成一个非常简单的事情:我在javascript模块文件上有一些代码,然后将其导入到另一个javascript文件中(不导出任何内容),我想从该文件中调用该文件中的某些已定义函数直接HTML。

让我们看一下我所发生的事情的一些有代表性的最小示例(实际上测试了代码,并给出了我在真实代码中遇到的完全相同的问题,实际上并没有比这个复杂得多):

没有import(并且将所有函数定义放在单个.js文件中),我可以直接从HTML调用函数。但是,一旦介绍了模块,我将不再能够:它只是说未定义“ hello()”函数。

我是ES6模块(实际上是前端javascript)的新手,所以我完全知道我刚才所说的只是缺乏知识(或了解),但是我希望对我在做什么做错任何评论,并且如何解决它,这样我可以将我的代码保存在不同的文件中并能够使用它。谢谢大家!

Fel*_*ing 7

每个模块都有自己的范围。他们没有像“普通”脚本那样共享全局范围。这意味着hello只能在main.js模块/文件本身内部访问。

如果您明确想要创建一个全局变量,则可以通过在全局对象上创建一个属性来实现window

function hello()
{
    console.log(mod());
}
window.hello = hello;
Run Code Online (Sandbox Code Playgroud)

另请参见在JavaScript函数中定义全局变量


话虽如此,避免全局变量是一种好习惯。相反,您可以在创建按钮之后重组HTML以加载模块,并通过JavaScript绑定事件处理程序:

<!DOCTYPE html>
<html>
    <body>
        <button name="next-button">Obi-Wan abandons the high ground to salute you</button>
        <script type="module" src="module.js"></script>
        <script type="module" src="main.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

import { mod } from './module.js';

function hello()
{
    console.log(mod());
}
document.querySelector('button').addEventListener('click', hello);
Run Code Online (Sandbox Code Playgroud)

  • 哦,我不知道!它工作完美,但我想知道是否没有办法以另一种方式做到这一点:不是添加一个全局变量来从全局范围访问该函数,是否有一种方法可以从 HTML 访问模块范围?或者也许还有其他方法,例如直接从模块文件将处理程序添加到按钮,这会起作用吗? (7认同)
  • @LewisMorris:答案是:“这取决于”。如果您只是想制作原型或正在编写一个非常小的应用程序,那么就可以做任何您想做的事情。应用程序越大,您可能需要的结构化方法就越多。随着时间的推移,您还可以改变做事的方式。毕竟软件很容易适应:) (2认同)