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

时间:2017-03-14 09:35:57

标签: 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将模块插入当前范围,但导入模块使用的常量在哪个范围内?

1 个答案:

答案 0 :(得分:2)

这两个lol函数现在是closures,这意味着虽然它们仍会在每个funcOnefuncTwo函数中被调用,但它们在某种意义上是隐藏的他们不公开访问。

使用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的更多信息。