我正在寻找一些帮助,以帮助我理解我正在从事的项目中的某些内容。尽管不确定为什么,但我已经写了一些可以正常运行的代码。
在Node.js服务器中,/ public / js中有两个脚本。一个(file1.js
)具有功能func()
。在同一目录中的file2.js
成功调用func()
。没有module.export
或require
的任何地方,但两个文件一起工作。但是,它们都在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>
...
我已经花了一整天的时间阅读,却找不到与此主题相关的任何内容。
答案 0 :(得分:2)
您的问题是关于JavaScript在浏览器中的工作方式。
Node.js在这里不相关。它所做的只是运行一个HTTP服务器程序,该程序将静态文件提供给浏览器。
使用脚本元素(而不使用type="module"
)将脚本加载到浏览器中时,脚本文件最外层的任何变量(例如不是let
的变量在一个块中或在函数中的var
中)变成一个 global ,并且可以通过这种方式加载到同一HTML文档中的任何其他脚本进行访问。
全局变量是混乱的,并且是不同代码意外相互干扰的好方法,因此现代JavaScript通常避免使用它们。最初在浏览器中实现JS时,这种JavaScript编程风格并不普遍:因此,存在上述行为。
这就是为什么人们开始使用诸如the revealing module pattern之类的技术的原因,以及为什么在将AMD加入规范之前设计Node和standard 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
以下的任何地方。