如果我有三个文件,基本上是这样的:
file_one.js:
const lol = () => {
console.log('Laughing out loud in file_one')
}
const funcOne = () => {
lol()
}
export default funcOne
file_two.js:
const lol = () => {
console.log('Laughing out loud in file_two')
}
const funcTwo = () => {
lol()
}
export default funcTwo
one_and_two_importer.js:
import funcOne from 'file_one'
import funcTwo from 'file_two'
funcOne()
funcTwo()
我的假设是函数lol将在全局范围内,从而导致命名空间冲突,但显然不会发生.另外,如果我尝试在one_and_two_importer.js中记录函数lol,我会得到未定义的错误.
作为documentation says,import将模块插入当前作用域,但导入模块使用的常量是哪个作用域?
最佳答案 两个lol函数现在是
closures,这意味着虽然它们仍然在每个funcOne和funcTwo函数中被调用,但它们是隐藏的,因为它们不能公开访问.
使用ES6模块(或commonJS),注入本地名称空间的唯一名称是您明确导入的名称,例如在所有情况下
import x from 'y'
import { x } from 'y'
import * as x from 'y'
命名空间只会获得x的附加变量.没有其他变量以隐藏方式注入.
获得冲突的唯一方法是,如果要在两个文件中显式导出lol变量,然后尝试按名称导入它.例如,在两个文件中都有
export lol
然后
import { lol } from 'file_one'
import { lol } from 'file_two'
除非你尝试做这样的事情,否则两个lol变量将限定在各自的模块中,因此不会相互冲突.
我建议在JavaScript中阅读更多关于how closures work的内容.