有关从其他文件调用函数的问题-Javascript

时间:2019-05-27 17:10:11

标签: javascript html node.js

我正在寻找一些帮助,以帮助我理解我正在从事的项目中的某些内容。尽管不确定为什么,但我已经写了一些可以正常运行的代码。

在Node.js服务器中,/ public / js中有两个脚本。一个(file1.js)具有功能func()。在同一目录中的file2.js成功调用func()。没有module.exportrequire的任何地方,但两个文件一起工作。但是,它们都在index.ejs文件中引用。这是他们能够交流的地方吗?

//file1.js
function func() {
    console.log("foo")
}
//file2.js

func()
//index.ejs
...
<script src="public/js/file1.js"></script>
<script src="public/js/file2.js"></script>
...

我已经花了一整天的时间阅读,却找不到与此主题相关的任何内容。

2 个答案:

答案 0 :(得分:2)

您的问题是关于JavaScript在浏览器中的工作方式。

Node.js在这里不相关。它所做的只是运行一个HTTP服务器程序,该程序将静态文件提供给浏览器。

使用脚本元素(而不使用type="module")将脚本加载到浏览器中时,脚本文件最外层的任何变量(例如不是let的变量在一个块中或在函数中的var中)变成一个 global ,并且可以通过这种方式加载到同一HTML文档中的任何其他脚本进行访问。

全局变量是混乱的,并且是不同代码意外相互干扰的好方法,因此现代JavaScript通常避免使用它们。最初在浏览器中实现JS时,这种JavaScript编程风格并不普遍:因此,存在上述行为。

这就是为什么人们开始使用诸如the revealing module pattern之类的技术的原因,以及为什么在将AMD加入规范之前设计Nodestandard JavaScript modules模块的原因。

答案 1 :(得分:1)

您必须了解全局空间在Javascript中的行为。

此代码:

<script src="public/js/file1.js"></script>
<script src="public/js/file2.js"></script>

与此相同:

<script>
    //file1.js
    function func() {
        console.log("foo");
    }

    func();
</script>

由于file1.js一旦被加载,其中定义的所有内容都将在包含该页面的页面中的任何位置可用。

由于file2.js使用file1.js的内容,所以它将起作用,因为func可以包含在file1.js以下的任何地方。