javascript – 如果在导入的模块中使用但在其外部声明,是否存在两个常量命名空间冲突的风险?

如果我有三个文件,基本上是这样的:

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的内容.

点赞