如果我有三个文件,基本上是这样的:
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将模块插入当前范围,但导入模块使用的常量在哪个范围内?
答案 0 :(得分:2)
这两个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的更多信息。