如果我有三个文件,基本上是这样的:
file_one.js:
const lol = () => {
console.log('Laughing out loud in file_one')
}
const funcOne = () => {
lol()
}
export default funcOne
Run Code Online (Sandbox Code Playgroud)
file_two.js:
const lol = () => {
console.log('Laughing out loud in file_two')
}
const funcTwo = () => {
lol()
}
export default funcTwo
Run Code Online (Sandbox Code Playgroud)
one_and_two_importer.js:
import funcOne from 'file_one'
import funcTwo from 'file_two'
funcOne()
funcTwo()
Run Code Online (Sandbox Code Playgroud)
我的假设是函数 lol 将在全局范围内,从而导致命名空间冲突,但显然这不会发生。此外,如果我尝试在 one_and_two_importer.js 中记录函数 lol,我会收到未定义的错误。
正如文档所说,导入将模块插入到当前范围,但导入模块使用的常量在哪个范围内?
这两个lol函数现在是闭包,这意味着尽管它们仍然在每个funcOne和funcTwo函数内部被调用,但它们是隐藏的,因为它们不可公开访问。
对于 ES6 模块(或 commonJS),注入本地名称空间的唯一名称是您显式导入的名称,例如在所有情况下
import x from 'y'
import { x } from 'y'
import * as x from 'y'
Run Code Online (Sandbox Code Playgroud)
命名空间只会获取 的附加变量x。没有其他变量以隐藏方式注入。
发生冲突的唯一方法是在两个文件中显式导出lol变量,然后尝试按名称导入它。例如两个文件中都有
export lol
Run Code Online (Sandbox Code Playgroud)
进而
import { lol } from 'file_one'
import { lol } from 'file_two'
Run Code Online (Sandbox Code Playgroud)
除非您尝试执行类似的操作,否则这两个lol变量的作用域将仅限于各自的模块,因此不会相互冲突。
我建议阅读更多有关JavaScript 中闭包如何工作的内容。