js中的包裹和全局变量



我有一个简单的HTML文件,其中包括一些简单的javascript文件。没有框架,就没有模块。在其他JS文件中有一个主要的JS文件和助手函数。

当我把它作为一个静态网站打开时,一切都正常。一个文件中的JS代码可以调用另一个文件定义的函数。

当我尝试使用package bundler,将其指向index.html文件时,package会找到我所有的JS文件,并在开头添加一些内容,在文件名后面添加一个散列,并修改HTML文件中的链接。一切都很好。

然而,当我在浏览器中打开这个页面时,发现我在一个JS文件中定义的代码无法看到在其他JS文件上定义的函数,从而抛出ReferenceError: <func> is not defined。当我检查HTML页面中包含的JS脚本时,函数确实是在全局范围中定义的。这有多奇怪?

据我所知,当包裹进行传输时,它会在文件顶部设置一些变量,这些变量可以用作全局变量:

var globalObject =
typeof globalThis !== 'undefined'
? globalThis
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: {};

如果您在执行parcel watch时查看该文件,您将在文件顶部看到它。

因此,基本上,如果您希望一个变量是全局的,那么在您第一次声明该变量的javascript文件中,您必须将其设置为将其附加到上面的任何一个全局变量。例如:

global.fruit =  'Mango';

window.fruit = 'Mango';

fruit现在成为窗口的全局变量,您可以从设置全局水果对象的文件之后的其他JS文件中的全局范围访问它

最新更新